说到索引更新,就一定要先了解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 中的改变合并,再在空闲时异步更新到磁盘中。The purge operation periodically and efficiently writes updated
Changes are periodically merged as secondary index pages are read into the buffer pool
接下来,我们将整个数据更新的流程梳理一下
1、 当用户执行更新操作时,MySQL先去看该数据页在不在buffer pool中;
2、 如果在且是二级索引,则直接更新buffer pool中相关的数据页(索引包含在数据页的 user record 部分);
3、 如果在且是唯一索引,则需要先判定更新操作是否会破坏数据的唯一性,如果不会的话就 更新相关数据页;
4、 如果所需数据页不在buffer pool中且是唯一索引,则需要立即从磁盘中加载相关数据页到buffer poo1中,并判断更新操作是否会破坏数据的唯一性,如果不会的话就更新相关数据页;
5、 如果不在且请求的是二级索引,则需要使用到change pool来进一步减少I/O操作。
Was this helpful?
0 / 0