MySQL带WHERE子句时MAX函数与ORDER BY LIMIT 1性能差异原因
性能差异的根本原因
二者执行时选择的索引和执行逻辑完全不同,直接导致了上千倍的性能差距:
ORDER BY id DESC LIMIT 1的执行逻辑:
优化器选择了主键id的倒序索引扫描,从最大的id开始逐行校验open_time > 0的过滤条件,只要找到第一条符合条件的记录就直接终止查询返回结果。你的场景中open_time > 0是非常宽松的过滤条件,几乎所有行都满足,所以扫描第一条就命中,实际只扫描了1行数据,耗时极短。MAX(id)的执行逻辑:
优化器默认优先匹配WHERE子句对应的索引,选择了open_time的唯一索引,先做范围扫描取出所有满足open_time > 0的218万条记录,再对这些全量符合条件的记录做聚合计算求取最大id,全量扫描的成本极高,所以耗时长达1秒以上。
优化方案
如果需要MAX()写法也达到相近的性能,可以创建(open_time, id)的联合索引,优化器可以直接从联合索引的排序结构中定位到满足open_time > 0的最大id,不需要扫描全量符合条件的记录。
内容的提问来源于stack exchange,提问作者prupru
相关产品推荐
相关产品推荐

