选择合适的索引列顺序

正确的顺序依赖于使用该索引的查询语句,同时,还需要考虑如何更好地满足排序分组操作的需要。

在一个多列 B-tree 索引中,索引列的顺序意味着索引首先按照最左列进行排序,其次是第二列,等等。所以索引可以按照升序或者降序进行扫描,以满足精确符合列顺序的 ORDER BYGROUP BYDISTINCT 等子句的查询需求。所以,多列索引的列顺序至关重要。

对于如何选择索引的列顺序有一个重要的经验法则:将选择性最高的列放到索引最前列。这个建议准确吗?在很多场景中可能有帮助,但是要全面地考虑各种场景的话,考虑如何避免大量随机 I/O 和排序可能更重要。

  • 当不需要考虑排序和分组时,将选择性最高的列放在前面通常是很好的。这时索引的作用只是优化查询语句中的 WHERE 条件。在这种情况下,按这个原则设计的索引确实能够最快地过滤出需要的行,对于在 WHERE 子句中只使用了索引部分前缀列的查询来说,选择性也更高。

  • 性能不只依赖于所有索引列的选择性(整体基数),也和查询条件的具体值有关,也就是和值的分布有关。可能需要根据那些运行频率最高的查询来调整索引列的顺序,让这种情况下索引的选择性最高。

最后更新于