JavaGuide icon indicating copy to clipboard operation
JavaGuide copied to clipboard

MySQL高性能优化规范建议总结之如何选择索引列的顺序上一个建议的理由存在问题

Open fox-half-tian opened this issue 6 months ago • 1 comments

🏠 MySQL高性能优化规范建议总结

原文:

建立索引的目的是:希望通过索引进行数据查找,减少随机 IO,增加查询性能 ,索引能过滤出越少的数据,则从磁盘中读入的数据也就越少。

  • 区分度最高的放在联合索引的最左侧(区分度=列中不同值的数量/列的总行数)
  • 尽量把字段长度小的列放在联合索引的最左侧(因为字段长度越小,一页能存储的数据量越大,IO 性能也就越好)
  • 使用最频繁的列放到联合索引的左侧(这样可以比较少的建立一些索引)

关于第二点,尽量把字段长度小的列放在联合索引的最左侧。

文中给出的理由是因为字段长度越小,一页能存储的数据量越大,IO 性能也就越好。

但在 MySQL InnoDB 存储引擎的 B+ 索引树数据结构中,非叶子节点存储的每个索引条目中包含了这块索引搜索树的所有的索引字段值,以及指向下一级的指针。

因此,对于已经确定的联合索引中的这些索引,无论怎么调换位置应该也改变不了存储的索引条目的大小,一页能存储的数据量还是那么多。

所以我觉得这个第二条并不能作为选择索引顺序的参考条件,更像是作为选择什么字段充当索引的建议。

即:

  • 对于索引建立的原则,建议使用数据类型小的字段作为索引。当然,这个建议更适合于主键的选择,因为在 Innodb 存储引擎中,主键字段不仅存储在聚簇索引中的每个节点,还存在于非聚簇索引的叶子节点。参考这条建议的主键可以节省更多的内存与磁盘空间。

fox-half-tian avatar Aug 29 '24 08:08 fox-half-tian