提问人:nickf 提问时间:1/9/2009 更新时间:10/13/2021 访问量:75436
最小值/最大值与 ORDER BY 和 LIMIT
MIN/MAX vs ORDER BY and LIMIT
问:
在以下查询中,您认为哪种方法更好?你的原因是什么(代码效率、更好的可维护性、更少的 WTFery)......
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
答:
SELECT MIN(`field`)
FROM `tbl`;
仅仅因为它与 ANSI 兼容。限制 1 特定于 MySql,因为 TOP 特定于 SQL Server。
评论
如果性能可以接受,我会使用第一个,因为它在语义上更接近意图。
如果性能是一个问题,(大多数现代优化器可能会将两者优化为相同的查询计划,尽管您必须进行测试以验证这一点),那么我当然会使用更快的。
我认为答案取决于你在做什么。
如果您有一个 1 关闭查询,并且意向与您指定的一样简单,则最好选择 min(field)。
但是,通常会将这些类型的需求更改为 - 获取前 n 个结果、获取第 n 个 - 第 m 个结果等。
我不认为提交到您选择的数据库是一个太可怕的主意。更改 dbs 不应该轻易做出,必须修改是您在进行此举时付出的代价。
为什么要现在限制自己,因为你以后可能会或可能不会感到疼痛?
我确实认为尽可能多地保持 ANSI 是件好事,但这只是一个指导方针......
在最坏的情况下,当您查看未编制索引的字段时,使用 需要对表进行一次完整传递。使用 和 需要文件排序。如果针对大型表运行,则感知性能可能会有显著差异。作为一个轶事数据点,在我的开发服务器上,对 106,000 行表进行了 .36 秒和 84 秒。MIN()
SORT
LIMIT
MIN()
SORT
LIMIT
但是,如果您正在查看索引列,则更难注意到差异(在这两种情况下,无意义的数据点都是 0.00 秒)。然而,从 explain 的输出来看,它似乎能够简单地从索引中提取最小值(“选择优化的表”和“NULL”行),而 and 仍然需要对索引进行有序遍历(106,000 行)。实际的性能影响可能可以忽略不计。MIN()
SORT
LIMIT
这似乎是要走的路 - 它在最坏的情况下更快,在最好的情况下无法区分,是标准的 SQL,并且最清楚地表达了您想要获得的价值。正如 mson 所提到的,唯一似乎使用 和 是可取的情况是,您正在编写一个常规操作,该操作从任意列中查找顶部或底部的 N 个值,并且不值得写出特殊情况操作。MIN()
SORT
LIMIT
评论
order by
limit
group by
max
正如 mson 和 Sean McSomething 所指出的,MIN 是可取的。
ORDER BY + LIMIT 有用的另一个原因是,如果要获取与 MIN 列不同的列的值。
例:
SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1
评论
SELECT some_other_field, field FROM tbl WHERE field = ( SELECT MIN(field) FROM tbl )
)
user650654 表示,当需要“获取与 MIN 列不同的列的值”时,LIMIT 为 1 的 ORDER BY 很有用。我认为,在这种情况下,我们仍然有更好的性能,使用 MIN 而不是排序进行两次单次传递(希望这:(优化)
SELECT some_other_field, field
FROM tbl
WHERE field=(SELECT MIN(field) FROM tbl)
评论
上一个:生成填字游戏的算法 [已关闭]
评论