change buffer
当需要更新一个数据页时,如果数据页在内存中(buffer pool)就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB会将这些更新操作缓存在change buffer中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。
什么时候用到change buffer
如果是唯一索引,要检查是否唯一,所以要将数据页读入内存才能判断。如果内存里有这个数据页,就没必要使用change buffer了。所以唯一索引的更新不能用change buffer。
插入数据流程
如果这个记录要更新的目标页在内存中,InnoDB的处理流程如下:
- 对于唯一索引来说,找到3和5之间的位置,判断到没有冲突,插入这个值,语句执行结束;
- 对于普通索引来说,找到3和5之间的位置,插入这个值,语句执行结束。
这个记录要更新的目标页不在内存中。这时,InnoDB的处理流程如下:
- 对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束;
- 对于普通索引来说,则是将更新记录在change buffer,语句执行就结束了。
将磁盘读入内存是随机IO。
change buffer的副作用
如果把数据放入change buffer后,马上读数据,那change buffer会把数据页加载进内存,然后更新。这样还比用唯一索引多了一步加入change buffer的步骤。所以该业务场景不适合用普通索引。
总结
尽量用普通索引。
如果所有的更新后面都马上伴随对这个记录的查询,那应该关闭change buffer