Mysql普通索引和唯一索引该如何选

142 阅读2分钟

1 查询过程

  • 对于唯一索引,查找到第一个满足条件的记录后,就会停止继续检索
  • 对于普通索引,查找到满足条件的第一个记录后,需要继续查找下一个记录,直到不满足条件为止,大概率是在一个索引页(读取到内存)中进行,很快

结论:在查询的过程中,普通索引跟唯一索引的差别不大,都很快

2 更新过程

更新过程中唯一索引跟普通索引的区别

  • 对于唯一索引,无论索引页(对于主键而言是数据页)是否已经读取到内存,都不会用到change buffer,原因是需要在内存中进行唯一性判断,如果目标页不在内容中会先将目标页读取到内存
  • 对于普通索引,如果索引页在内存中不存在,则会直接更新记录到change buffer,随之更新结束,之后会将change buffer中的记录merge到索引页

结论:由于唯一索引用不上 change buffer 的优化机制,因此如果业务可以接受,从性能角度出发优先考虑非唯一索引

change buffer

  • 对于普通索引,如果更新时内存中不存在要更新索引页,InnoDB 会将这些更新操作缓存在change buffer中,这样就不需要从磁盘中读入这个数据页了
  • change buffer 中的操作应用到原数据页,得到最新结果的过程称为merge,以下情况会merge:
  1. 访问这个索引页时
  2. 后台线程会定期 merge
  3. 数据库正常关闭(shutdown)的过程中
  • change buffer 可以节省随机读磁盘的 IO 消耗

3 总结

在业务允许不适用数据库进行唯一性判断的时候,选用普通索引有助于提高写入效率