普通索引于唯一索引

##知识点

  • LRU
  • change Buffer
  • buffer pool

查询过程

名称 过程
普通索引 查询第一条满足条件的数据,继续查找直到不满足条件停止
唯一索引 查找到第一条,因为保持了唯一性停止查找

InnoDB 数据读写按照数据页为单位读写,也就是说不是把记录本身从磁盘读出来,而是以页为单位读入内存。对于普通索引来说找到第一条记录它所在的数据页就在内存中了,所以后续消耗不大

更新过程

在更新过程中,如果数据页在内存中就直接更新。如果数据没在内存中,在不影响一致性的前提下,InooDB会将更新操作缓存在 change buffer 中节省磁盘的随机读取,在下次查询访问这个数据页的时候读入内存,在change buffer中执行这个页有关操作保证逻辑正确性。数据从change buffer 中写入内存中主要 会在 查询访问这个数据,数据库关闭或者定期默认merge。

什么索引能用到Change Buffer

唯一索引会验证数据的唯一性这个操作需要把数据读入内存才能判断,所以这种就会直接修改内存页上的数据,写到Change Buffer就多此一举了。所以Change Buffer 只有普通索引可以使用

Buffer Pool

Change Buffer 会把数据临时写入 Buffer Pool。为了提高大容量读取操作效率,Buffer Pool会基于LRU定期刷新数据到磁盘上

选择

普通索引和唯一索引查询效率差不多,考虑对更新性能的影响尽量选择普通索引。当然前提是保证业务的情况下,不是所有业务场景等能靠程序来维护数据唯一性的。在读写密集型的场景下Change Buffer带来的收益并不明显,反而更复杂。在更新操作频繁,查询操作少的情况下Change Buffer就会发挥很大的功效

可参考文档

Change Buffer

Buffer Pool

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~