下面两个 MySQL 谁的效率更高呢?
SELECT MIN(`field`) FROM `tbl`;
SELECT `field` FROM `tbl` ORDER BY `field` LIMIT 1;
这其实是在问一个 o(n) 和 o(nlogn) 哪个更快的问题。
最坏的情况,就是没有对 filed 添加索引的情况下。使用 MIN() 或 MAX() 需要单次读取所有的表数据,而使用 ORDER BY LIMII 则首先需要文件排序。
如果数据量超大,那么性能的差异是很明显的。在我的测试机上 ORDER BY LIMIT 往往需要两倍 MIN()/MAX() 的时间。
但是,如果对 field 字段添加了索引,那么差距就不那么明显了。MIN()/MAX() 可以直接从索引中获取最大值和最小值。但 ORDER BY LIMII 仍然需要对索引进行排序。实际的差异可能就微不足道了。
从上面的论述来看,MIN()/MAX() 可能是更好的选择,因为最坏的情况下它更好,最好的情况下差不多。
更何况 MIN()/MAX() 更能表达我们出 SQL 的原本意思。
ORDER BY LIMIT 的使用场景,应该用来查询 TOP N 或者 LOWER N 且 N > 1 这种数据。也就是说获取前 N 条数据列表这种非特例的操作。
目前尚无回复