MySQL限制语法与查询性能

MySQL限制语法与查询性能,mysql,query-performance,Mysql,Query Performance,我想知道使用限制语法对查询性能有何影响 有18万行。因此,我将使用限制语法选择数据。 所以我想知道limit语法和查询性能之间的关系。limit通常可以节省从MySQL服务器向请求客户端发送大型结果集的部分成本。如果只需要几个结果集行,而不是简单地跳过客户端上不需要的行,那么最好使用LIMIT 存在一个臭名昭著的性能反模式使用限制。像这样的问题 SELECT a,whole,mess,of,columns,... FROM big_table JOIN big_tableb ON som

我想知道使用限制语法对查询性能有何影响 有18万行。因此,我将使用限制语法选择数据。 所以我想知道limit语法和查询性能之间的关系。

limit通常可以节省从MySQL服务器向请求客户端发送大型结果集的部分成本。如果只需要几个结果集行,而不是简单地跳过客户端上不需要的行,那么最好使用LIMIT

存在一个臭名昭著的性能反模式使用限制。像这样的问题

 SELECT a,whole,mess,of,columns,...
   FROM big_table JOIN big_tableb ON something JOIN big_tablec ON something ....
  ORDER BY whole, mess DESC
  LIMIT 5
在MySQL中,浪费服务器资源时间和RAM。为什么?它生成一个大的结果集,然后对其进行排序,然后丢弃除几行以外的所有行

另一个性能反模式是限制应用于复杂结果集的小数值和大数值。它必须快速浏览多行才能获得少量行

您可以使用延迟连接模式来解决这些问题,如下所示:

   SELECT a,whole,mess,of,columns,..
     FROM (
         SELECT big_table_id
          FROM big_table JOIN big_tableb ON something JOIN big_tablec ON something ....
         ORDER BY whole, mess DESC
         LIMIT 5, 200000
        ) ids,
   JOIN big_table ON ids.big_table_id = big_table.big_table_id
   JOIN big_tableb ON something JOIN big_tablec ON  something ...
这种模式排序,然后丢弃一些id值,而不是一大堆列

在结果集通过索引排序的情况下,使用LIMIT确实有助于提高性能。例如,如果您在日期戳上有索引,并且

 SELECT datestamp, col, col
   FROM table
  ORDER BY datestamp DESC
  LIMIT 20

MySQL查询计划器可以向后扫描日期戳索引,只检索20行。

快速评估任何SQL命令影响的最简单方法是使用解释和检查行数等。。从解释查询开始通常是一个好方法。只需在查询前加上“解释”就可以知道它有多贵

发送大数据集可能不是问题,而是排序问题

根据我的经验,使用顺序的速度非常慢。通常情况下,LIMIT和ORDER BY由于明显的原因一起使用,排序是最慢的部分,而不是LIMIT本身


LIMIT确实避免返回可能被丢弃的大型数据集,但实际上数据库通常位于同一本地网络或甚至同一服务器上。网络性能和大型数据集通常不是限制因素。相反,在返回数据之前对数据进行排序的成本是最高的。通过优化这些排序,您可以获得最大的好处,例如创建与查询匹配的索引。

如果最近没有我不知道的改进,这两者之间就没有关系。限制可能会降低查询执行速度。。当您使用大偏移量时,例如限制10000000,10000000。。因为需要提取20000000条记录。最有可能的是MySQL需要使用一个临时表来执行查询。@RaymondNijland如果不使用LIMIT,您将收到所有数据,这些数据必须通过通信通道发送,以便您将其丢弃,这将更加缓慢。与查询可以使用的position列相比,它的速度更慢,但这在所有情况下都不可能/可行。这可能很有用:我想知道它在查询性能中是如何受到影响的,那么为什么您不自己编写查询并测量其性能呢?它是LIMIT offset,LIMIT,所以你的一些评论是反向的。解释通常忽略了限制。所以,不要依赖它来帮助我们。