Mysql:聚合函数的奇怪行为

时间:2014-05-23 09:16:12

标签: mysql sql

我有表,大约有1亿行:

my_table
  |-id
  |-created
  |-..

我需要:选择最小创建值;

第一种方法:(超慢,无限远)

SELECT MIN(created) FROM my_table;

第二种方法:(超快,约100毫秒)

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?

问题: 为什么?!为什么第一种方法如此缓慢而第二种方法如此之快?看来是一样的操作吗?

2 个答案:

答案 0 :(得分:1)

created上没有索引,所以要找到min,它必须扫描所有记录。显然你有id的索引(看起来像它的主键)所以它很快找到min和max。然后它只选择2个值的最小值。

答案 1 :(得分:1)

您感到困惑INBETWEEN

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_id, @max_id)也可以写为WHERE id = @min_id or id = @max_id

现在,如果订购了您的表,这实际上可能会提供正确的解决方案。但如果不是,它将产生错误的结果。