概述
今天我们从原理上画出InnoDB内部详细的查询语句流程图和更新语句的流程图。在画这两个流程图之前,我们先了解下InnoDB中的一些经常听到的技术。(都是系列写的建议大家花有点时间把之前的几篇看一下,有个上下文)
缓冲(内存)
-
change buffer: 写缓冲
对普通索引页进行写操作时,如果该页不在缓冲池中,并不会立刻将磁盘页加载到缓冲池,而仅仅记录缓冲变更(buffer changes),等未来数据被读取时,再将数据合并(merge)恢复到缓冲池中的技术。写缓冲的目的是降低写操作的磁盘IO,提升数据库性能。 -
buffer pool: 缓存池
存放索引页、数据页、undo页、change buffer、自适应哈希索引、InnoDB存储的锁信息(lock info)、数据字典信息(data dictionary)等 -
redo log buffer:redo log的缓冲
-
bin cache:bin log的缓冲
动作
-
merge:将 change buffer 中的操作设置到原数据页,得到最新结果的过程称为 merge。
-
purge: 删除回滚段(undo log 段)及真正删除物理数据
-
flush: 将脏页刷回磁盘
题外话:我们说说什么是脏页?脏页就是内存和磁盘不一致时,是脏页。当flush到磁盘后,内存和磁盘一致了,就叫干净页。我们前面说了Mysql是先更新内存及写日志,真正的数据更新是通过flush动作刷回的,所以虽然我们叫脏页但内存中的数据才是最新的。
查询详细流程
更新详细流程
参考资料
- 高性能Mysql
- MySQL实战45讲