MySQL限制语法与查询性能

时间:2017-12-08 12:24:59

标签: mysql query-performance

我想知道如何使用限制语法来影响查询性能 有180000行。所以我会使用限制语法选择数据。 所以我想知道限制语法和查询性能之间的关系。

2 个答案:

答案 0 :(得分:3)

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

使用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)。为什么?它生成一个大的结果集,然后对其进行排序,然后丢弃除了几行之外的所有行。

另一个性能反模式LIMIT small_number, big_number应用于复杂的结果集。它必须通过许多行来获取少量行。

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

   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确实有助于性能。例如,如果您在datestamp上有索引,那么

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

MySQL查询规划器可以向后扫描datestamp索引,只检索20行。

答案 1 :(得分:1)

快速评估任何SQL命令影响的最简单方法是使用EXPLAIN并检查行数等。从EXPLAIN开始查询通常是一条好路线。只需在查询之前加上“EXPLAIN”,即可了解它的价格。

发送大型数据集可能不是问题 - 这是排序

根据我的经验,使用ORDER BY 非常慢。由于显而易见的原因,LIMITORDER BY经常被使用,而且排序是缓慢的部分,而不是LIMIT本身。

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