MYSQL和LIMIT子句

时间:2010-05-12 12:05:33

标签: php mysql optimization query-optimization limit-clause

我想知道在查询中添加LIMIT 1会加快处理速度吗?

例如......

我有一个查询,大部分时间会返回1个结果,但偶尔会返回10个,100个甚至1000个记录。但我只想要第一张唱片。

限制1会加快速度还是没有差别?

我知道我可以使用GROUP BY返回1个结果,但这只会增加更多的计算。

任何想法都很乐意接受!

由于

5 个答案:

答案 0 :(得分:4)

这取决于你是否有ORDER BY。 ORDER BY无论如何都需要整个结果集,因此可以订购。

如果您没有任何ORDER BY,它应该运行得更快。

它会在所有情况下至少运行一点,因为当然不需要发送整个结果集。

答案 1 :(得分:2)

是的!它会!

但是可以肯定的是,在你的sql语句结尾添加'Limit 1'只需要一秒钟,所以为什么不给出一个镜头看看

答案 2 :(得分:2)

这完全取决于查询本身。如果您正在进行索引查找(其中indexedColumn = somevalue)或索引列上的排序(没有Where子句),那么限制1将真正加快它的速度。如果你有连接或多个where / order子句,那么事情变得非常复杂。但是,使用“LIMIT 1”将带走的主要因素是从不减慢查询速度。它有时会加速它,但它永远不会减慢速度。

现在,处理PHP时还有另一个问题。默认情况下,PHP将在从查询返回之前缓冲整个结果集(mysql_query或mysqli->查询将仅在下载所有记录后返回)。因此,虽然查询时间可能几乎没有被限制1改变,但PHP用于缓冲结果的时间和内存是很重要的。想象一下,每行有200个字节的数据。现在,您的查询返回10,000行。这意味着PHP必须分配额外的2mb内存(实际上接近10mb,带有php的变量结构的开销),这是你永远不会使用的。分配内存可能非常昂贵,因此一般规则只能分配您需要的内容(或者您认为需要)。当你只想要1时下载10,000行就是浪费。

结合这两种效果,你可以看到为什么如果你只想要一行,你应该总是使用“LIMIT 1”。

答案 3 :(得分:0)

来自MySQL网站的主题

Here is some relevant documentation

它似乎可以通过不同方式加快速度,具体取决于查询的其他部分。我不确定当你没有ORDERGROUPHAVING条款时它是否有帮助,除了能够立即停止而不是回馈每一个结果行(可能是如果你要获得100,000条记录,那么速度要快得多。)

答案 4 :(得分:0)

这实际上是LIMIT子句的基本目的:P如果你知道你想要多少结果,你应该总是将这个数字指定为LIMIT,不仅因为它更快(除非你做了ORDER BY),在PHP脚本中提高内存效率。

注意:我假设您将PHP与PHP一起使用,因为您已将PHP添加到标记中。如果您只是直接从MySQL中选择(在脚本语言之外),那么在使用ORDER BY时使用LIMIT的好处纯粹是为了使结果更易于管理。