代码之家  ›  专栏  ›  技术社区  ›  Lizard

mysql和limit子句

  •  2
  • Lizard  · 技术社区  · 14 年前

    我想知道向查询添加限制1是否会加快处理速度?

    例如。。。

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

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

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

    任何想法都乐意接受!

    谢谢

    5 回复  |  直到 14 年前
        1
  •  4
  •   extraneon    14 年前

    这要看你是否有订单。ORDER BY无论如何都需要整个结果集,因此可以对其进行排序。

    如果你没有任何订单,它应该运行得更快。

    在任何情况下,它都会运行得更快,因为当然不需要发送整个结果集。

        2
  •  2
  •   Addsy    14 年前

    是的!它会的!

    但要确定的是,在SQL语句的末尾添加“limit 1”只需要一秒钟,所以为什么不试一试,看看

        3
  •  2
  •   ircmaxell    14 年前

    这完全取决于查询本身。如果您正在执行索引查找(indexedColumn=someValue)或对索引列进行排序(不带WHERE子句),那么limit 1将真正加快速度。如果您有join或多个where/order子句,那么事情会很快变得非常复杂。但要带走的主要东西,使用“限制1”将 从未 放慢查询速度。它有时会加快速度,但不会减慢速度。

    现在,在处理PHP时还有另一个问题。默认情况下,php将在从查询返回之前缓冲整个结果集(mysql_query或mysqli->查询仅在下载完所有记录后返回)。因此,尽管查询时间可能会被限制为1,但是php用来缓冲结果的时间和内存是非常重要的。假设每行有200字节的数据。现在,查询返回10000行。这意味着PHP必须分配一个额外的2MB内存(实际上接近10MB的内存,其中包含了PHP变量结构的开销),您将永远不会使用它。分配内存可能非常昂贵,所以一般规则是只分配您需要的(或认为您需要的)。当你只想要1时下载10000行是浪费。

    结合这两种效果,您可以看到为什么如果只需要一行,则应该始终使用“限制1”。

        4
  •  0
  •   Phil    14 年前

    Here is some relevant documentation 关于MySQL站点的主题。

    根据查询的其他部分,它似乎可以以不同的方式加快速度。我不确定当你没有 ORDER GROUP HAVING 条款,除了能够立即停止而不是返回每个结果行(如果您要返回100000条记录,这可能是一个足够快的速度)。

        5
  •  0
  •   David    14 年前

    实际上,这是limit子句的基本目的:p如果您知道您想要多少结果,那么您应该始终将该数字指定为限制,这不仅是因为它更快(除非您正在执行order by),而且要更高效地处理PHP脚本中的内存。

    注意:我假设您将mysql与php结合使用,因为您将php添加到了标签中。如果您只是直接从MySQL中选择(脚本语言之外),那么在使用ORDERBY时使用LIMIT的优势纯粹是为了使结果更易于管理。