为什么此查询使用索引?

时间:2012-08-23 20:40:40

标签: mysql sql

我有一张包含销售信息的表格。其中一列名为royalty_currency,我需要从此表中提取所有不同的货币。执行此操作的查询是:

SELECT distinct `royalty_currency` FROM `sales_raw`

当我在这个专栏上没有索引时,explain语句给了我:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  sales_raw   ALL NULL    NULL    NULL    NULL    195121  Using temporary

添加索引后,explain语句给了我:

id  select_type table       type    possible_keys key              key_len  ref rows    Extra
1   SIMPLE      sales_raw   range   NULL          royalty_currency92        NULL    211 Using index for group-by

我的问题是,为什么SELECT语句需要使用索引?我认为索引是WHERE子句的?如果只选择一个列,为什么需要使用索引?最后,这是我使用的常见查询 - 我应该在royalty_currency上添加索引吗?

3 个答案:

答案 0 :(得分:2)

查询优化工具似乎会改变distinct royalty_currency中的group by royalty_currency要求。直观地说,应该清楚这两者是相同的。

group-by使用索引,因为查找具有相同“royalty_currency”的记录会更有效率。在此列的索引中而不是在表本身中(在索引中,这些记录都按顺序存储在B +树索引的叶节点中 - 假设B +树索引)

为了向您提供更多技术细节,我可以告诉您B +树的叶节点是在链表中连接的。查询引擎所做的是转到B +树(索引)的最右边的叶子并开始读取每个叶子中的所有值,每次找到它返回它的新值时它会忽略其余的相同值值。

答案 1 :(得分:1)

索引不仅用于条件,它们可以用于连接表格,也可以用于分组。

查询被解释为:

select royalty_currency from sales_raw group by royaly_currency

索引用于分组,这非常适合索引已经分组。如您所见,当使用索引时,引用行的数量会大大减少,从而使查询使用的资源更少。

答案 2 :(得分:-1)

就是这么说,正在使用GROUP BY的索引。我知道您没有使用明确的GROUP BY,但这就是它对您DISTINCT的作用。因此,优化器认为使用索引(我假设将该列作为其键的一部分)更好,以获取该列的不同值。