MySQL中多列索引中的列顺序

MySQL中多列索引中的列顺序,mysql,optimization,indexing,Mysql,Optimization,Indexing,我试图理解在定义多列索引时什么更好: 将最具选择性的列放在第一位(更高的基数,用于速度?);或 将选择较少的列放在第一位(较低的基数,用于索引压缩?) 或者这取决于我是在优化速度还是空间?总是将最具选择性的列放在开头,很少有其他原因 或者这取决于我是在优化速度还是空间 让我这样说吧。如果使用更少的存储空间会导致索引根本不被使用,那又有什么意义呢?如果低基数索引(按列顺序)不是查询的覆盖索引,则通常不使用它,因为返回其他列的数据会非常昂贵 索引的目的是帮助查询,并且将它们按正确的顺序(基数)排

我试图理解在定义多列索引时什么更好:

  • 将最具选择性的列放在第一位(更高的基数,用于速度?);或
  • 将选择较少的列放在第一位(较低的基数,用于索引压缩?)

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

总是将最具选择性的列放在开头,很少有其他原因

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

让我这样说吧。如果使用更少的存储空间会导致索引
根本不被使用,那又有什么意义呢?如果低基数索引(按列顺序)不是查询的覆盖索引,则通常不使用它,因为返回其他列的数据会非常昂贵


索引的目的是帮助查询,并且将它们按正确的顺序(基数)排列始终是首要考虑事项。

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

阅读更多

更新:

有关基数的问题,请阅读。 这和你的问题相似吗?它回答了吗

WHERE person_id = 123 AND country_code = 'AT'
使用

在这种情况下,索引列的顺序在速度或空间上没有差别

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

基数只在比较单独的索引时起作用,而不在对复合索引中的列排序时起作用。就是

INDEX(person_id)  -- is better than
INDEX(country_code)
但两者都不如综合指数好

为了

最好的索引是

INDEX(country_code, person_name)   -- in THIS order!
中的顺序,其中
对优化没有影响


更多提示和讨论:

我负责顺序(最左边的部分可用于单列查询等),但我仍然可以灵活地决定谁是第一名,谁是第二名。我正在寻找一个提示来选择哪个去哪里。你读了链接了吗?要么我不理解问题,要么给出的答案是“按照他们通常被查询的顺序”。是的,我读了:例如a列的索引=基数=23,b=基数=1000000,c=基数=500000。我的查询总是需要a、b或a、b、c列。如果您希望两个查询都能对所有2/3列使用索引,那么您的索引必须在(a、b、c)上。[这个输入的东西在中间得到了这个注释]是的,我读过:例如,a列上的索引=基数=23,b=基数=1000000,c=基数=500000。我的查询需要a、a、c列或a、b、c列。我基本上可以创建索引(c,a,b)+(a)或(a,b,c)+(a,c)。您的索引顺序是由索引要服务的查询定义的。一旦您通过查询定义了索引,您就无法选择它们的显示顺序,而不会使索引对某些查询不可用。同样,我理解这一点,但在为查询服务的两个选项之间,哪一个更好,接受基数上的巨大差异?@sbargay你找到这个问题的答案了吗?我知道你在问什么。如果您有country\u id和person\u id,那么设置索引country\u id、person\u id更好,还是先用person\u id、country\u id设置更高的基数更好。显然,您知道如何在查询中正确使用索引,但我有与您相同的问题。好的-假设我保存了country id(低基数)和person id(高基数)。同一个人id可以存在于多个国家/地区。我应该输入国家/地区id、个人/地区id还是反之亦然?我有时需要从一个国家/地区检索所有人,有时需要访问具有同一个人id的所有人
WHERE person_name LIKE 'James%' AND country_code = 'UK'
INDEX(country_code, person_name)   -- in THIS order!