任何人都可以从官方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的东西。
答案 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
(我的示例中为a
和b
)中提到的所有列的索引。
对不起,我似乎比手册更清晰。
答案 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不匹配。希望有所帮助。