我有一张包含销售信息的表格。其中一列名为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
上添加索引吗?
答案 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
的作用。因此,优化器认为使用索引(我假设将该列作为其键的一部分)更好,以获取该列的不同值。