使用MySQL,是否有必要以与索引中相同的顺序提及列?

时间:2013-03-09 18:03:57

标签: mysql indexing

我有一个表艺术家,它有一个像这样的索引

combo1 => by_id, origin, genre

我运行查询

SELECT * FROM artists 
    WHERE by_id = '324' 
      AND genre = 'rock' 
      AND origin = 'Australia'

SELECT * FROM artists 
    WHERE by_id = '324' 
      AND origin = 'Australia' 
      AND genre = 'rock'

显然,在第二个查询中,列被提及,因为它们在索引中。当我在这些上运行EXPLAIN时,它会使用索引显示 。但我有点困惑,第二个会比第一个更快。是吗?

2 个答案:

答案 0 :(得分:3)

没有区别,因为只要包含列,优化器就会处理订单。

WHERE by_id = '324' AND origin = 'Australia' AND genre = 'rock'
| ID | SELECT_TYPE |   TABLE |  TYPE | POSSIBLE_KEYS |     KEY | KEY_LEN |               REF | ROWS |       EXTRA |
-------------------------------------------------------------------------------------------------------------------
|  1 |      SIMPLE | artists | const |       PRIMARY | PRIMARY |      80 | const,const,const |    1 | Using index |
WHERE by_id = '324' AND genre = 'rock' AND origin = 'Australia'
| ID | SELECT_TYPE |   TABLE |  TYPE | POSSIBLE_KEYS |     KEY | KEY_LEN |               REF | ROWS |       EXTRA |
-------------------------------------------------------------------------------------------------------------------
|  1 |      SIMPLE | artists | const |       PRIMARY | PRIMARY |      80 | const,const,const |    1 | Using index |

如果你碰巧遗漏了by_id,那么索引就不会被使用(索引从左到右工作)

WHERE genre = 'rock'
| ID | SELECT_TYPE |   TABLE |  TYPE | POSSIBLE_KEYS |     KEY | KEY_LEN |    REF | ROWS |                    EXTRA |
---------------------------------------------------------------------------------------------------------------------
|  1 |      SIMPLE | artists | index |        (null) | PRIMARY |      80 | (null) |    1 | Using where; Using index |
WHERE origin='Australia' AND genre = 'rock'
| ID | SELECT_TYPE |   TABLE |  TYPE | POSSIBLE_KEYS |     KEY | KEY_LEN |    REF | ROWS |                    EXTRA |
---------------------------------------------------------------------------------------------------------------------
|  1 |      SIMPLE | artists | index |        (null) | PRIMARY |      80 | (null) |    1 | Using where; Using index |

答案 1 :(得分:-3)

第二次查询应该比第一次查询更快。

列在索引定义中列出的顺序很重要。可以仅使用第一个索引列来检索一组行标识符。但是,仅使用第二个或更大的索引列来检索行标识符集是不可能的或有效的(在大多数数据库上)。

例如,假设一个电话簿首先由城市组织,然后按姓氏组织,然后按名字组织。如果您获得了城市,则可以轻松提取该城市的所有电话号码列表。但是,在这本电话簿中找到给定姓氏的所有电话号码是非常繁琐的。您必须在每个城市的区域内查找具有该姓氏的条目。有些数据库可以执行此操作,其他数据库则不会使用索引。