1

我有一张包含销售信息的表格。其中一列称为royalty_currency,我需要从该表中提取所有不同的货币。这样做的查询是:

SELECT distinct `royalty_currency` FROM `sales_raw`

当我在此列上没有索引时,解释语句给了我:

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

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

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吗?

4

3 回答 3

2

查询优化器似乎将您的distinct royalty_currency需求转换为group by royalty_currency. 直观地说,应该清楚两者是相同的。

group-by 使用索引是因为在该列的索引中找到具有相同 'royalty_currency' 的记录比在表本身中更有效(在索引中,这些记录都按顺序存储在 B+ 的叶节点中树索引 - 假设 B+ 树索引)

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

于 2012-08-23T20:50:42.177 回答
1

索引不仅用于条件,还可以用于连接表之类的事情,在你的情况下,还可以用于分组。

查询被解释为:

select royalty_currency from sales_raw group by royaly_currency

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

于 2012-08-23T20:50:37.200 回答
-1

它在那里说,正在使用GROUP BY. 我知道您没有使用显式GROUP BY,但这就是它对您的DISTINCT. 因此,优化器认为最好使用索引(我假设该列作为他的键的一部分)来获取该列的不同值。

于 2012-08-23T20:47:11.627 回答