我有表,大约有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?
问题: 为什么?!为什么第一种方法如此缓慢而第二种方法如此之快?看来是一样的操作吗?
答案 0 :(得分:1)
created
上没有索引,所以要找到min,它必须扫描所有记录。显然你有id
的索引(看起来像它的主键)所以它很快找到min和max。然后它只选择2个值的最小值。
答案 1 :(得分:1)
您感到困惑IN
和BETWEEN
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
现在,如果订购了您的表,这实际上可能会提供正确的解决方案。但如果不是,它将产生错误的结果。