说到索引更新,就一定要先了解MySQL的buffer pool和change buffer。buffer pool是主存中用来存储常用数据和索引的一块空间,它通过LRU(Least recently used)algorithm来替换页(其实和操作系统中的“页”的概念是相似的,都是从磁盘拉到主存中的一块数据),buffer pool的存在,即缓存的存在都是为了减少I/O操作,因为I/O操作太费时间了(毕竟不是由CPU直接管辖的)。
change pool是缓冲区的一部分(如下图所示),它用来负责二级索引(也就是非聚集索引)的更新。当数据增、删、改之后,不在buffer pool中的二级索引页的改变会先被缓存在change buffer中,当读操作来临时,相关的索引页被加载到buffer pool中,并与change buffer中的改变合并,再在空闲时异步更新到磁盘中。
接下来,我们将整个数据更新的流程梳理一下。
(1)当用户执行更新操作时,MySQL先去看该数据页在不在buffer pool中;
(2)如果在且是二级索引,则直接更新buffer pool中相关的数据页(索引包含在数据页的user record部分);
(3)如果在且是唯一索引,则需要先判定更新操作是否会破坏数据的唯一性,如果不会的话就更新相关数据页;
(4)如果所需数据页不在buffer pool中且是唯一索引,则需要立即从磁盘中加载相关数据页到buffer pool中,并判断更新操作是否会破坏数据的唯一性,如果不会的话就更新相关数据页;
(5)如果不在且请求的是二级索引,则需要使用到change pool来进一步减少I/O操作。
MySQL中Innodb引擎的索引更新策略
最新推荐文章于 2023-12-13 12:00:00 发布