MySQL中多列索引中的列顺序

时间:2011-01-23 23:36:19

标签: mysql optimization indexing

我正在尝试了解定义多列索引时更好的方法:

  • 首先选择最具选择性的列(更高的基数,速度?);或
  • 先选择较少选择性的列(较低的基数,用于索引压缩?)

或许这取决于我是在优化速度还是空间?

3 个答案:

答案 0 :(得分:9)

列的顺序应该与稍后查询列的顺序相匹配,否则MySQL将不使用它们。 这是你应该考虑的问题。

了解更多here

更新:

关于基数的问题,请阅读this。 这与你的问题类似吗?它回答了吗?

答案 1 :(得分:4)

总是把最具选择性的专栏放在一开始,很少有理由反过来。

  

或者可能取决于我是在优化速度还是空间?

让我这样说吧。如果导致索引not to be used at all,那么使用较少存储的重点是什么?如果它不是查询的覆盖索引,则通常不会使用低基数索引(按列顺序),因为返回其他列的数据将非常昂贵。

索引的目的是协助查询并以正确的顺序(基数)将它们放在第一位也是最重要的考虑因素。

答案 2 :(得分:0)

WHERE person_id = 123 AND country_code = 'AT'

使用

INDEX(person_id, country_code)  -- in EITHER order!

这种情况下,索引列顺序的速度空间没有 差异。

是的,MyISAM具有“索引压缩”功能,但是现在不再使用了。

基数仅在比较单独的索引时起作用,而对在复合索引中的列排序无关。也就是说,

INDEX(person_id)  -- is better than
INDEX(country_code)

但是两者都不如综合索引。

对于

WHERE person_name LIKE 'James%' AND country_code = 'UK'

最好的索引是

INDEX(country_code, person_name)   -- in THIS order!

WHERE中的顺序对优化没有影响。

更多提示和讨论:http://mysql.rjweb.org/doc.php/index_cookbook_mysql