标签: MySQL

Qbian | 2022-09-21 | 后端相关MySQL数据库

有哪些常见的数据库优化方法?

前言 面试官:敖丙你简历上写了你会数据库调优,你都是怎么调优的? 敖丙:加索引。 面试官:还有么? 敖丙:没了。 面试官:我们公司的门你知道在哪里吧,自己走还是我送你? 哈哈开头这个场景是我臆想的一个面试场景,但是大家是不是觉得很真实,每个人的简历上但凡写到了数据库,都会在后面顺便写一句,会数据库调优。 但是问题就来了,面试官一问到数据库调优的,大家就说加索引,除了加索引大家还知道别的么? 或者索引相关的点你全部都知道么?聚簇索引,非聚簇索引,普通索引,唯一索引,change buffer,表锁、[行锁](https://www.zhihu.com/search?q=%E8%A1%8C%E9%94%81&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2...

 722 |  2 |  1 后端相关MySQL

Qbian | 2022-07-14 | 后端相关MySQL

慢 SQL 分析与优化

背景介绍 -------- 从系统设计角度看,一个系统从设计搭建到数据逐步增长,SQL 执行效率可能会出现劣化,为继续支撑业务发展,我们需要对慢 SQL 进行分析和优化,严峻的情况下甚至需要对整个系统进行重构。所以我们往往需要在系统设计前对业务进行充分调研、遵守系统设计规范,在系统运行时定期结合当前业务发展情况进行系统瓶颈的分析。 从数据库角度看,每个 SQL 执行都需要消耗一定 I/O 资源,SQL 执行的快慢,决定了资源被占用时间的长短。假如有一条慢 SQL 占用了 30%的资源共计 1 分钟。那么在这 1 分钟时间内,其他 SQL 能够分配的资源总量就是 70%,如此循环,当资源分配完的时候,所有新的 SQL 执行将会排队等待。所以往往一条慢 SQL 会影响到整个业务。 本文仅讨论 MySQL-InnoDB 的情况。 优化方式 -------- SQL 语句执行效率的主要因素 数据量 SQL 执行后返回给客户端的数据量的大小; 数据量越大需要扫描的 I/O 次数越多,数据库服务器的 IO 更容易成为瓶颈。 取数据的方式 数据在缓存中还是在磁盘...

 830 |  1 |  9 后端相关MySQL

一碗白米饭 | 2021-12-12 | 后端相关MySQL

记一次数据表删除后回滚案例

背景 发现很多人对开源社区的部署教程说写的太简单了,然后就想自己从0开始部署一下,记录下部署过程,但是在初始化数据库的时候,选错了数据库,选了线上数据库,导致执行建表语句的时候删除了已有的线上数据表,导致线上数据被删除。 删除后就想着有过备份,但是已经在两周之前了,这两周内操作的记录就要全部丢失,这部分数据还是挺多的,在数据尽量不丢失的前提下,想到了看看能不能通过 binlog 日志回放的方式,把之前的数据都恢复回来。 恢复数据 数据恢复期间不要有新的数据插入进来,会导致数据恢复的不全 。 1. 登录mysql js mysql -u ${mysql user name} -p 2. 查询 binlog 文件 执行 show master status\G 命令查看 binlog 文件名。 3. 查询 binlog 文件

 438 |  3 |  2 后端相关MySQL

晚风 | 2021-11-29 | 后端相关MySQL数据库

一个线上SQL死锁异常分析:深入了解事务和锁

引发死锁的原因是什么?如何避免?本文详细介绍了和死锁有关的知识点,通过深入分析MySQL事务和锁的机制,结合案例背景,找到了问题的所在,并梳理了解决方案,详解其原理。希望对同学们有所启发。 一 背景 最近线上消费MetaQ的服务频繁报SQL死锁异常,虽然最终可以基于事务自动回滚和逻辑重试保证最终正确性,但若一直放任不管,海量报警日志会掩盖真正需要紧急处理的异常,同时频繁回滚也会降低消费端的吞吐量。个人通过分析线上服务日志、MySQL死锁日志、梳理MySQL在RR级别下的锁机制,找到了真正的问题所在,并对业务处理逻辑进行了优化,特在此整理出来,互相学习提升,如果文中有错误的地方欢迎指正。 二 知识储备 正所谓“工欲善其事,必先利其器”,在具体介绍CASE背景和解决方案前,先对需要系统了解的知识点进行详细介绍,以便大家能够快速理解解决方案。 死锁通常是因为两个及以上事务发生了死循环锁依赖,此时不得不回滚来释放锁,那么事务是个什么东西? 1 事务 为什么需要事务? 我们在业务实现时,经常需要保证某一批SQL能够具备ACID特性,如果没有事务,...

 1304 |  6 |  0 后端相关MySQL

流苏 | 2021-11-10 | 后端相关Spring 全家桶MySQLJava

面试官:如何避免出现SQL注入漏洞

一 前言 本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案。 二 SQL注入漏洞的原理、形成原因 SQL注入漏洞,根本上讲,是由于错把外部输入当作SQL代码去执行。目前最佳的解决方案就是预编译的方式。 SQL语句在执行过程中,需要经过以下三大基本步骤: 1. 代码语义分析 2. 制定执行计划 3. 获得返回结果 而一个SQL语句是由代码和数据两部分,如: sql SELECT id, name, phone FROM userTable WHERE name = 'xiaoming'; SELECT id, name, phone FROM userTable WHERE name = 是代码,'xiaoming'是数据。 而预编译,以Mybatis为例,就是预先分析带有占位符的语义: 如 sql SELECT id, name, phone FROM userTable WHERE id = {name};

 1276 |  8 |  0 后端相关Spring 全家桶

叶凡 | 2021-11-10 | MQ 消息中间件Redis后端相关MySQLJava

缓存与数据库一致性保证

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一、需求缘起 上一篇《[缓存架构设计细节二三事](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ &mid=404087915&idx=1&sn=075664193f334874a3fc87fd4f712ebc&scene=21 wechat_redirect)》(点击查看)引起了广泛的讨论,其中有一个结论:当数据发生变化时,“先淘汰缓存,再修改数据库”这个点是大家讨论的最多的。 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败。 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据,Cache中是旧数据,数据不一致【如

 873 |  4 |  0 MQ 消息中间件Redis

雨馨 | 2021-11-10 | 后端相关MySQL

庖丁解InnoDB之UNDO LOG

Undo Log是InnoDB十分重要的组成部分,它的作用横贯InnoDB中两个最主要的部分,并发控制(Concurrency Control)和故障恢复(Crash Recovery),InnoDB中Undo Log的实现亦日志亦数据。本文将从其作用、设计思路、记录内容、组织结构,以及各种功能实现等方面,整体介绍InnoDB中的Undo Log,文章会深入一定的代码实现,但在细节上还是希望用抽象的实现思路代替具体的代码。本文基于MySQL 8.0,但在大多数的设计思路上MySQL的各个版本都是一致的。考虑到篇幅有限,以及避免过多信息的干扰,从而能够聚焦Undo Log本身的内容,本文中一笔带过或有意省略了一些内容,包括索引、事务系统、临时表、XA事务、Virtual Column、外部记录、Blob等。 一 Undo Log的作用 数据库故障恢复机制的前世今生中提到过,Undo Log用来记录每次修改之前的历史值,配合Redo Log用于故障恢复。这也就是InnoDB中Undo Log的第一个作用: 1 事务回滚 在设计数据库时,我们假设数据库可能在任何时刻,...

 597 |  5 |  0 后端相关MySQL

雨馨 | 2021-11-10 | 后端相关MySQL

庖丁解InnoDB之REDO LOG

数据库故障恢复机制的前世今生一文中提到,今生磁盘数据库为了在保证数据库的原子性(A, Atomic) 和持久性(D, Durability)的同时,还能以灵活的刷盘策略来充分利用磁盘顺序写的性能,会记录REDO和UNDO日志,即ARIES方法。本文将重点介绍REDO LOG的作用,记录的内容,组织结构,写入方式等内容,希望读者能够更全面准确的理解REDO LOG在InnoDB中的位置。本文基于MySQL 8.0代码。 一 为什么需要记录REDO 为了取得更好的读写性能,InnoDB会将数据缓存在内存中(InnoDB Buffer Pool),对磁盘数据的修改也会落后于内存,这时如果进程或机器崩溃,会导致内存数据丢失,为了保证数据库本身的一致性和持久性,InnoDB维护了REDO LOG。修改Page之前需要先将修改的内容记录到REDO中,并保证REDO LOG早于对应的Page落盘,也就是常说的WAL,Write Ahead Log。当故障发生导致内存数据丢失后,InnoDB会在重启时,通过重放REDO,将Page恢复到崩溃前的状态。 二 需要什么样的REDO 那...

 687 |  5 |  0 后端相关MySQL

OOM | 2021-11-05 | 后端相关MySQL

聊聊redo log是什么?

前言 说到MySQL,有两块日志一定绕不开,一个是InnoDB存储引擎的redo log(重做日志),另一个是MySQL Servce层的 binlog(归档日志)。 只要是数据更新操作,就一定会涉及它们,今天就来聊聊redo log(重做日志)。 redo log redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。 比如MySQL实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。 上一篇中讲过,MySQL中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加...

 743 |  6 |  2 后端相关MySQL

温酒 | 2021-11-03 | 后端相关MySQL

MySQL执行计划

使用 explain 输出 SELECT 语句执行的详细信息,包括以下信息: 表的加载顺序 sql 的查询类型 可能用到哪些索引,实际上用到哪些索引 读取的行数 Explain 执行计划包含字段信息如下:分别是 id 、 select_type 、 table 、 partitions 、 type 、 possible_keys 、 key 、 key_len 、 ref 、 rows 、 filtered 、 Extra 12个字段。 通过explain extended + show warnings可以在原本explain的基础上额外提供一些查询优化的信息,得到优化以后的可能的查询语句(不一定是最终优化的结果)。 先搭建测试环境: sql CREATE TABLE blog ( blog_id int NOT NULL AUTO_INCREMENT COMMENT '唯一博文id--主键', blog_title varchar(255) NOT NULL COMMENT '博文标题', blog_body t

 724 |  5 |  0 后端相关MySQL

温酒 | 2021-11-03 | 后端相关MySQL

MySQL基础

简介 SQL 结构化查询语言。 数据类型 主要包括以下五大类: 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT 浮点数类型:FLOAT、DOUBLE、DECIMAL 字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB 日期类型:Date、DateTime、TimeStamp、Time、Year 其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等 整型 | MySQL数据类型 | 含义(有符号) | | ------------ | ----------------------------------- | | tinyint(

 2160 |  2 |  0 后端相关MySQL

温酒 | 2021-11-03 | 后端相关MySQL

MySQL高频面试题

事务的四大特性? 事务特性ACID : 原子性 ( Atomicity )、 一致性 ( Consistency )、 隔离性 ( Isolation )、 持久性 ( Durability )。 原子性 是指事务包含的所有操作要么全部成功,要么全部失败回滚。 一致性 是指一个事务执行之前和执行之后都必须处于一致性状态。比如a与b账户共有1000块,两人之间转账之后无论成功还是失败,它们的账户总和还是1000。 隔离性 。跟隔离级别相关,如 read committed ,一个事务只能读到已经提交的修改。 持久性 是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 数据库的三大范式 第一范式1NF 确保数据库表字段的原子性。 比如字段 userInfo : 广东省 10086' ,依照第一范式必须拆分成 userInfo : 广东省 userTel : 10086 两个字段。 第二范式2NF

 2071 |  5 |  0 后端相关MySQL

后端小二 | 2021-10-29 | 后端相关Spring 全家桶MySQLJava

Mybatis知识点总结

Mybatis简介 JDBC定义了连接数据库的接口规范,每个数据库厂商都会提供具体的实现,JDBC是一种典型的桥接模式。 传统的JDBC编程 获取数据库连接; 操作Connection,打开Statement对象; 通过Statement对象执行SQL,返回结果到ResultSet对象; 关闭数据库资源 java public class javaTest { public static void main(String[] args) throws ClassNotFoundException, SQLException { String URL="jdbc:mysql://127.0.0.1:3306/imooc?useUnicode=true //1.加载驱动程序 Class.forName("com.mys

 1932 |  6 |  3 后端相关Spring 全家桶