具有查询性能的 MySQL 限制语法

Posted

技术标签:

【中文标题】具有查询性能的 MySQL 限制语法【英文标题】:MySQL limit syntax with Query performance 【发布时间】:2017-12-08 12:24:58 【问题描述】:

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

【问题讨论】:

如果最近没有一些我不知道的改进,这两者之间没有关系。 LIMIT 会减慢查询的执行速度。当您使用像 LIMIT 10000000, 10000000 这样的大偏移量时 .. 因为需要获取 20000000 条记录。而且很可能 mysql 需要使用临时表来执行查询。 @RaymondNijland 如果不使用 LIMIT,您将收到所有数据,这些数据必须通过通信通道发送才能丢弃,这会更慢。与查询可以使用的位置列相比,它只慢一些,但这并非在所有情况下都是可能/可行的。 这可能有用:***.com/a/34500/2225030 “我想知道它是如何影响查询性能的” 那么您为什么不自己编写查询并衡量它们的性能呢? 【参考方案1】:

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 索引并仅检索二十行。

【讨论】:

(是LIMIT offset, limit,所以你的一些cmets是倒退的。)【参考方案2】:

快速评估任何 SQL 命令的影响的最简单方法是使用EXPLAIN 并检查行数等。以EXPLAINing 开头的查询通常是一个不错的方法。只需在查询前加上“EXPLAIN”即可了解它的成本。

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

根据我的经验,ORDER BY 的使用非常很慢。出于显而易见的原因,LIMITORDER BY 经常一起使用,这是排序较慢的部分,而不是 LIMIT 本身。

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

【讨论】:

EXPLAIN 通常会忽略 LIMIT。所以,不要依赖它来提供帮助。

以上是关于具有查询性能的 MySQL 限制语法的主要内容,如果未能解决你的问题,请参考以下文章

具有并发读写的Mysql查询性能

高性能mysql 第6章 查询性能优化

具有复杂查询匹配模式的 MySQL 与 PostgreSQL 性能

mysql之性能指标查询

Mysql-单表查询的操作和注意事项

MySQL - 使用 LIMIT 更新查询