MIN和MAX的MySQL索引

时间:2016-05-02 20:56:15

标签: mysql sql optimization indexing query-optimization

任何人都可以从官方MySQL documentation

中澄清这一点
  

使用索引...查找特定索引列key_col的MIN()或MAX()值。这是由预处理器优化的,该预处理器检查您是否在索引中的key_col之前出现的所有关键部分上使用WHERE key_part_N =常量。在这种情况下,MySQL对每个MIN()或MAX()表达式执行单个键查找,并用常量替换它。如果所有表达式都替换为常量,则查询立即返回。例如: SELECT MIN(key_part2),MAX(key_part2)FROM tbl_name WHERE key_part1 = 10;

所以在他们的例子中,他们试图找到名为key_col的col的最小值和最大值。他们使用复合索引key_part1_key_part2吗? key_part2部分是否代表key_col列?

我绝对不明白他们试图用常数替换表达式。你能帮我解决这个问题吗?

更新问题不在于WHERE语句如何在"最高级别"上工作,如果可以的话。我很困惑这个处理器的表达式在这一点上取代了关于MIN和MAX的东西。

2 个答案:

答案 0 :(得分:5)

SELECT MIN(b), MAX(b) FROM tbl WHERE a = 12;

INDEX(a, b)

两列,按此顺序。

查询在a = 12的索引中查找,抓取第一个(a,b)对以获取MIN(b)并抓取最后一对以获得MAX(b)

关于"替换为常数"的声明令人困惑,因为它太深入了解它如何首先弄清楚如何执行查询(恰好获得最小值和最大值)的细节,然后继续执行查询剩余的内容(没有剩下的)。 / p>

更一般地说,最佳索引通常WHERE列为首,与=的常量相比。之后它变得复杂,所以让我再说一遍:

A"覆盖" index是包含SELECT(我的示例中为ab)中提到的所有列的索引。

对不起,我似乎比手册更清晰。

答案 1 :(得分:1)

在他们的示例中,他们没有尝试查找名为key_col的列的最小值和最大值。他们试图在多列密钥中找到第二个密钥的最小值和最大值。该问题更加复杂,因为查询将其搜索限制为通过key_part1 = 10定义的多列密钥集的子集。

10, 2, 3
10, 9, 5
10, 7, 7
10, 3, 1
10, 2, 5
11, 3, 0
11, 0, 3

因此,在此示例中,查询仅选择第一列为10的行。然后,它会发现第一列中的行数为10,第二列的min为2,最大值为9.请注意0在第二列中未选择为min,因为第一列与10不匹配。希望有所帮助。