多列上的索引使用
Index Usage on Multiple Columns
我有一个 table,其中包含 2.5 亿条记录,记录了居住在美国的人们及其州、县和定居点。简化版本如下:
我在姓氏、地区、次地区和地方建立了综合索引。以下查询在同一时间执行:
SELECT SQL_NO_CACHE surname, place, count(*) as cnt FROM `ustest` group by place, surname;
SELECT SQL_NO_CACHE surname, region, count(*) as cnt FROM `ustest` group by region, surname;
我的印象是第一个查询不会使用索引,因为我认为要使用索引,您必须从左到右查询所有列。
谁能解释一下 MySQL 在这种情况下如何在多个列上使用索引?
如果不查看 EXPLAIN
输出,很难说出查询执行计划的具体细节。
但有两件事跳出来了:
- 两个查询都必须考虑 table 中的所有行(您没有
WHERE
子句)。
- 根据
surname
作为该索引的前导列扫描您的复合索引可以满足这两个查询。因为您正在计算项目,所以有必要进行紧密而不是松散的索引扫描。 (您可以阅读这些内容。)
所以他们有可能有相同的执行计划。
我有一个 table,其中包含 2.5 亿条记录,记录了居住在美国的人们及其州、县和定居点。简化版本如下:
我在姓氏、地区、次地区和地方建立了综合索引。以下查询在同一时间执行:
SELECT SQL_NO_CACHE surname, place, count(*) as cnt FROM `ustest` group by place, surname;
SELECT SQL_NO_CACHE surname, region, count(*) as cnt FROM `ustest` group by region, surname;
我的印象是第一个查询不会使用索引,因为我认为要使用索引,您必须从左到右查询所有列。
谁能解释一下 MySQL 在这种情况下如何在多个列上使用索引?
如果不查看 EXPLAIN
输出,很难说出查询执行计划的具体细节。
但有两件事跳出来了:
- 两个查询都必须考虑 table 中的所有行(您没有
WHERE
子句)。 - 根据
surname
作为该索引的前导列扫描您的复合索引可以满足这两个查询。因为您正在计算项目,所以有必要进行紧密而不是松散的索引扫描。 (您可以阅读这些内容。)
所以他们有可能有相同的执行计划。