SELECT MAX vs ORDER BY LIMIT 1这个问题在这里已经回答了好几次了,但是如果我添加一个WHERE子句,事情就会发生巨大的变化
这是我的表:
比较分析:
-> Index scan on table using PRIMARY (reverse) (cost=0.10 rows=2) (actual time=0.036..0.036 rows=1 loops=1)
和
-> Index range scan on table using open_time (cost=217786.76 rows=1081033) (actual time=0.031..705.926 rows=2180645 loops=1)
检查2行肯定比检查2,180,645行快得多。
在ORDER BY id DESC LIMIT 1
的查询中,它使用主键索引。从最后开始,因为顺序是相反的。然后,它只是向下迭代索引的叶节点(按降序),直到它检查第一行也匹配open_time > 0
。然后,LIMIT优化允许查询执行完成。根据它的统计数据,它估计在检查了2行之后会发生这种情况。
对于MAX(id)
的查询,使用open_time
上的索引。但是因为它是一个范围条件open_time > 0
,所以它不能假设在该范围的开始或结束处找到最大id。因此,它必须检查open_time
索引中的每个匹配条目,搜索id
的最大值(主键隐式地是二级索引的一部分)。不存在像LIMIT
查询那样的提前终止的机会。