多列上的索引使用

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 输出,很难说出查询执行计划的具体细节。

但有两件事跳出来了:

  1. 两个查询都必须考虑 table 中的所有行(您没有 WHERE 子句)。
  2. 根据 surname 作为该索引的前导列扫描您的复合索引可以满足这两个查询。因为您正在计算项目,所以有必要进行紧密而不是松散的索引扫描。 (您可以阅读这些内容。)

所以他们有可能有相同的执行计划。