当您知道只有1个结果时,是否在MySQL查询中添加“ LIMIT 1”会使其更快?


Answers:


81

根据查询,添加limit子句会对性能产生巨大影响。如果您只需要一行(或者知道只有一行可以满足查询这一事实),并且不确定内部优化器将如何执行它(例如,WHERE子句未命中索引等等),那么您绝对应该添加LIMIT子句。

至于优化的查询(在小型表上使用索引),性能可能无关紧要,但还是要重申一下-如果只对一行感兴趣,那么无论如何都不要添加LIMIT子句。


30
为了进行反调试,您可能要考虑发送LIMIT 2,然后在单行假设不成立的情况下进行投诉或轰炸。
杰弗里·汉汀

6
@JeffreyHantin如果真的只有一个,则应该向数据库添加唯一约束。然后,更干净的人通过健全性检查弄乱了您的代码。
Cristian Vrabie

@CristianVrabie当然可以将其表示为唯一约束,但这是有关表中数据的断言。发送LIMIT 2并检查1是关于查询本身的断言,它很可能包含一个错误,例如未充分指定连接条件。
杰弗里·汉汀

1
@JeffreyHantin足够公平,但是除非您为Mars Rover编写代码,否则为此编写测试,而不是污染您的代码。
Cristian Vrabie

8
@JeffreyHantin如果假设只有一个是正确的,那么添加LIMIT 2不会杀死任何优化,因为它将搜索所有行吗?在这种情况下,添加LIMIT 2并不比完全不添加(优化方面)更好。
克里斯·米德尔顿

19

限制可能会影响查询的性能(请参见下面的注释和链接),并且还会减少MySQL输出的结果集。对于希望获得单个结果的查询,它有很多好处。

此外,限制结果集实际上可以加快总查询时间,因为传输大结果集会占用内存,并有可能在磁盘上创建临时表。我之所以提到这一点,是因为最近我看到一个没有使用限制的应用程序由于巨大的结果集而杀死了服务器,而由于限制,资源利用率急剧下降。

检查此页面以获取更多详细信息:MySQL文档:LIMIT优化


您链接的页面说:“如果您仅选择LIMIT的几行,则在某些情况下,MySQL通常会选择使用全表扫描来使用索引。” 看起来查询本身始终不会像往常一样处理。

好点子。我根据使用EXPLAIN的观察结果进行了概括。谢谢你的收获。
rjamestaylor

该链接非常感谢。FWIW,大多数答案似乎适用于没有限制的情况下,结果集可能很大的情况。问题是,何时只有1行成功匹配是否重要?在这种情况下,“结果集”只有1行(甚至没有限制)。
制造商史蒂夫

5

如果只有1个结果返回,那么否,LIMIT将不会使其更快。如果有很多结果,而您只需要第一个结果,并且没有GROUP或ORDER by语句,那么LIMIT将使其更快。


2
如果没有唯一/主键,即使只有1行,它也应该更快,因为它在找到第一个匹配项
后便

克里斯(Kris),您的第一句话可以用以下两种方式之一阅读。如果您的意思是“可能仅返回1行”(例如查询唯一列),那么您所说的是正确的。OTOH,如果您的意思是“每当找到1个匹配结果时”限制将不会使其更快:您确定吗?有时不是避免必须拉入其他页面吗?
制造商史蒂夫·史蒂夫(Steve)

5

简而言之,答案是肯定的。如果将结果限制为1,则即使您“期望”一个结果,查询也会更快,因为您的数据库不会浏览所有记录。一旦找到与您的查询匹配的记录,它将停止。


1
该答案具有误导性,因为它缺少在其他答案(早于7年!)的注释中看到的警告,即如果DB知道只有一条记录可能匹配(例如查询唯一列),那么Limit 1将无效。
制造商史蒂夫(Steve)

认真吗 查询优化器可以利用某些条件保证只能返回1条记录这一事实。我指出您的答案在所有情况下都不正确。(因此,从几年前的发言中减去了价值。)如果您同意,您可以承认我的评论的正确性。如果您不同意,则可以说明原因。
制造商史蒂夫(Steve)

1

如果您确实只期望一个结果,那么将LIMIT附加到查询中确实很有意义。我不知道MySQL的内部工作原理,但是我敢肯定它不会收集100'000 +条记录的结果集,只是要将其截断为1。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.