读取性能:
- 唯一索引读取流程:查到目标值,停止查询,返回结果,因为目标值是唯一的。
- 普通索引读取流程:查到目标值,一直查到下一个值与目标值不相等时,停止查询,返回结果。
- 对比:因为MySQL每次查询,是将磁盘中的一个16KB大小的数据页读取到内存中,即使唯一索引只查询一个值,也要读取整个数据页,所以两者读取性能相差微乎其微。
更新性能:
- 普通索引更新流程:将更新的数据缓存到 change buffer 中,更新结束。
- 唯一索引更新流程:将数据页读入内存,判断有没有冲突,更新数据,更新结束。
- 对比:普通索引性能除了在一些特殊场景下(更新完记录,马上要查询),性能表现较好。
索引选择:
尽量选普通索引。特殊场景:更新完记录,马上伴随着查询该记录,建议关闭 change buffer 。
change buffer:当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB会将这些更新操作缓存在 change buffer 中,在下次查询需要访问这个数据页时(系统也会定期 merge ),将数据读入内存,然后执行 change buffer 中与这个数据页有关的操作(更新相关数据) ,这个过程称为 merge 。