唯一索引一定能提高性能吗?并不是

我们通过读和写两个场景分开讨论

读场景:

通过B+树从根节点开始层序遍历到叶子结点,数据页内部通过二分搜索

  • 普通索引:查到满足的第一条记录,继续查找下一条记录,直到找到不满足条件的记录
  • 唯一索引:查到第一个满足条件的记录,就停止搜索。
  • 普通索引比唯一索引就多了查找和判断下一条记录的操作,如果相同普通索引的数据很多,那么这个查找和判断会进行很多次

    所以在读场景唯一索引比普通索引性能要好(只要不经过磁盘,差距不是很大)

    写场景:

    假如需要在6和15之间插入12索引值

    目标页在buffer中

  • 普通索引 搜索到6和15之间的位置,然后插入
  • 唯一索引 搜索到6和15之间的位置,首先需要判断是否key冲突,没有冲突,然后插入
  • 目标页不在buffer中

  • 普通索引 将更新记录写入change buffer
  • 唯一索引 将数据页读入buffer,需要判断是否key冲突,没有冲突,然后插入
  • 在数据不在buffer中时,唯一索引需要磁盘加载数据判断数据冲突,这时是随机I/O,性能比较差,而普通索引使用change buffer就可以避免这种随机磁盘访问

    所以在写场景中普通索引比唯一索引性能要好

    总结:

  • 写操作比较多的场景建议使用普通索引,唯一性通过应用层保证
  • 普通索引能满足要求,尽量选用普通索引
  • ©著作权归作者所有,转载或内容合作请联系作者
    平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

    推荐阅读更多精彩内容