MySQL中的InnoDB一次update执行

先摆好一次select执行的图。

为什么标题是update却要摆放select执行的图?
首先要知道update修改数据并不是直接修改表中的数据,而是修改在内存中的数据页。而内存中的数据页是由执行器调用引擎接口加载到内存中的,这一部分跟select是一模一样的,所以直接复用一次select执行时的图。

与select的不同在什么地方?

执行器再找到数据后还有负责更新。这个更新就是修改再内存中的数据页。

除此之外还涉及到3个日志的更新,即undolog、redolog、binlog。

一个更新大致流程就结束了。

一定要加载到内存再修改?

要说的是前面讲到的buffer pool中存在一个change buffer的缓存,而内存中没有需要的数据页,可以将这个修改缓存在change buffer中,当以后有查询加载了这个数据页时,再应用这个修改。

启用change buffer是不是一定就是好的?

MySQL中有普通索引跟唯一索引,这个两个索引的作用不用多说。

启用change buffer修改普通索引的列时,就如我们预想的一样并没有什么问题。

需要注意的是,update后接一个select查询修改过的这行数据,这样的逻辑,change buffer几乎没有什么作用了。

唯一索引又有什么不同?

唯一索引的列上的值必不相同,所以需要判断这次update是否违反了唯一索引,这就造成了需要加载数据页到内存进行判断,然后修改。此时反而增加了维护change buffer的开销。

发布了17 篇原创文章 · 获赞 5 · 访问量 3339

猜你喜欢

转载自blog.csdn.net/qq_36592473/article/details/105334257