目录
MySQL刷盘原理
脏页和干净页
MySQL出现短暂的堵塞SQL现象
情况分析
应对措施
数据库表中数据删除原理
删除表中数据数据库空间大小不会改变
情况分析
应对措施
MySQL刷盘原理
一般主要分为两个步骤
内存更新和 redo log 记录是同一事务修改的两个必要操作,缺一不可
步骤1、数据进行修改的时候,把修改数据的记录放入内存并且写入到redo log
步骤2、当空闲的时候会进行数据的刷盘,这里的刷盘是指把修改的数据刷入到MySQL中
脏页和干净页
脏页: 内存和redo log修改了,但是MySQL磁盘没有修改
干净页: 内存、redo log、MySQL磁盘都修改了
MySQL出现短暂的堵塞SQL现象
常见的MySQL没有规律的偶尔堵塞的问题,一般就是和MySQL刷盘有关
情况分析
常见原因有两种
1、当redo log日志写满之后,会短暂的出现停止更新,强制MySQL刷盘操作
2、当内存满了之后,需要淘汰一些数据页,如果数据页是脏页,也会短暂的出现停止更新,强制MySQL刷盘操作
应对措施
此时我们需要合理的控制MySQL刷盘的速度,减少待刷盘脏页比例小于75%,减少这两种场景的出现
其中,控制MySQL刷盘速度需要考虑的因素
MySQL刷盘速度脏页比例和redo log写盘速度
数据库表中数据删除原理
在删除数据库中表的数据,因为数据是使用主键索引B+树存储的
所以即使删除,MySQL也只是在这个表的B+数索引上面加一个删除标记,后面插入数据的时候可能会复用,并不会重新构建一个没有删除数据的B+树
删除表中数据数据库空间大小不会改变
情况分析
通过上面的数据库删除原理可以知道,数据库表数据存储是通过主键索引B+树存储的。
数据库表中的数据删除只是在B+树上面的节点添加删除标记,并不会真正删除,后面有新数据插入可以复用这部分空间
应对措施
删表重建
1、把表需要保存的数据进行导出,然后把整个表删除掉,这里本质就是把这个表的主键索引B+树删除
2、重新创建表,导入需要保存的数据,此时本质就是重新建立主键索引B+树,主键索引 更紧凑,数据⻚的利⽤率也更⾼
这里只讨论原理,在具体场景中怎么保证数据库删表重建,具体问题具体分析
如:使用 ALTER TABLE 表名 ENGINE=InnoDB 命令重建表
这个命令的原理就是先创建一个数据相同的临时表,然后直接替换原表,执行过程中会限制表修改防止数据出现不一致现象