2

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

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在这些上运行时,它说它正在使用索引。但是我有点困惑第二个是否会比第一个更快。是吗?

4

2 回答 2

3

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

WHERE by_id = '324' AND origin = 'Australia' AND genre = 'rock'
| 身份证 | 选择类型 | 表 | 类型 | 可能键 | 关键 | KEY_LEN | 参考 | 行 | 额外 |
-------------------------------------------------- -------------------------------------------------- ---------------
| 1 | 简单 | 艺术家 | 常量 | 初级 | 初级 | 80 | 常量,常量,常量 | 1 | 使用索引 |
WHERE by_id = '324' AND genre = 'rock' AND origin = 'Australia'
| 身份证 | 选择类型 | 表 | 类型 | 可能键 | 关键 | KEY_LEN | 参考 | 行 | 额外 |
-------------------------------------------------- -------------------------------------------------- ---------------
| 1 | 简单 | 艺术家 | 常量 | 初级 | 初级 | 80 | 常量,常量,常量 | 1 | 使用索引 |

如果您碰巧遗漏了by_id,则不会使用索引(索引从左到右工作)

WHERE genre = 'rock'
| 身份证 | 选择类型 | 表 | 类型 | 可能键 | 关键 | KEY_LEN | 参考 | 行 | 额外 |
-------------------------------------------------- -------------------------------------------------- -----------------
| 1 | 简单 | 艺术家 | 索引 | (空) | 初级 | 80 | (空) | 1 | 使用哪里;使用索引 |
WHERE origin='Australia' AND genre = 'rock'
| 身份证 | 选择类型 | 表 | 类型 | 可能键 | 关键 | KEY_LEN | 参考 | 行 | 额外 |
-------------------------------------------------- -------------------------------------------------- -----------------
| 1 | 简单 | 艺术家 | 索引 | (空) | 初级 | 80 | (空) | 1 | 使用哪里;使用索引 |
于 2013-03-09T18:14:08.253 回答
-3

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

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

例如,想象一个电话簿,它首先按城市,然后按姓氏,然后按名字。如果您获得了城市,您可以轻松提取该城市的所有电话号码列表。然而,在这个电话簿中查找给定姓氏的所有电话号码将非常繁琐。您必须在每个城市的部分中查找具有该姓氏的条目。一些数据库可以做到这一点,而另一些则不会使用索引。

于 2013-03-09T18:14:02.443 回答