Mysql:聚合函数的怪异行为

Mysql:聚合函数的怪异行为,mysql,sql,Mysql,Sql,我有:大约有1亿行的表: my_table |-id |-created |-.. 我需要:选择最小创造值 第一种方法:(非常慢,大约无限大) SELECT MIN(created) FROM my_table; SELECT MIN(id) FROM my_table INTO @min_id; SELECT MAX(id) FROM my_table INTO @max_id; SELECT MIN(created) FROM my_table WHERE id IN (@m

我有:大约有1亿行的表:

my_table
  |-id
  |-created
  |-..
我需要:选择最小创造值

第一种方法:(非常慢,大约无限大)

SELECT MIN(created) FROM my_table;
SELECT MIN(id) FROM my_table INTO @min_id;
SELECT MAX(id) FROM my_table INTO @max_id;
SELECT MIN(created) FROM my_table WHERE id IN (@min_id, @max_id); //WHY THIS SELECT IS SO FAST?
第二种方法:(非常快,大约100毫秒)

SELECT MIN(created) FROM my_table;
SELECT MIN(id) FROM my_table INTO @min_id;
SELECT MAX(id) FROM my_table INTO @max_id;
SELECT MIN(created) FROM my_table WHERE id IN (@min_id, @max_id); //WHY THIS SELECT IS SO FAST?

问题:为什么?!为什么第一种方法如此缓慢,第二种方法如此快速?这似乎是相同的操作?

您在创建的
上没有索引,因此要找到min,它必须扫描所有记录。显然,您在
id
上有索引(看起来像是主键),所以它可以很快找到min和max。然后它只需选择两个值中的最小值。

您混淆了
中的
之间的

SELECT MIN(id) FROM my_table INTO @min_id;
SELECT MAX(id) FROM my_table INTO @max_id;
SELECT MIN(created) FROM my_table WHERE id IN (@min_id, @max_id); //WHY THIS SELECT IS SO FAST?
最后一个查询将只读取第一行和最后一行,并获取这两行的最小“创建”值,因为
WHERE id IN(@min\u id,@max\u id)
也可以写为
WHERE id=@min\u id或id=@max\u id


现在,如果您的表是有序的,这实际上可能会给出正确的解决方案。但如果不是,它将产生错误的结果。

这是索引的魔力:)因为在第一种方法中从整个表中搜索,在第二种方法中从最小值(id)和最大值(id)中搜索。在第二种方法中,您对id应用过滤器,所以不搜索满足条件的有限记录的整个表VB:不,您不搜索“从”和“到”,您只搜索这两个值。在
中的
之间的
之间存在差异。第二种方法是完全错误的,因为它只从两个特定行中获取创建的
最小值:id最低的行和id最高的行。它不计算
最小值(已创建)
适用于所有行。请解释
只需选择min of 2
以了解更多详细信息。在我看来,MySQL应该在第一种和第二种情况下进行相同数量的比较。\n因为您最后一次选择只需要检查两个值,而不是1亿。where子句有一个IN,其中只有两个值。请注意,除非对表进行排序,否则您的结果可能是错误的……第三个查询首先查找(带索引)两条id分别为min_id和max_id的记录。然后从这两条记录中选择最小值