具有查询性能的 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
并检查行数等。以EXPLAIN
ing 开头的查询通常是一个不错的方法。只需在查询前加上“EXPLAIN”即可了解它的成本。
发送大型数据集可能不是问题——这是排序
根据我的经验,ORDER BY
的使用非常很慢。出于显而易见的原因,LIMIT
和 ORDER BY
经常一起使用,这是排序较慢的部分,而不是 LIMIT
本身。
LIMIT
确实避免返回可能会被丢弃的大型数据集,但实际上数据库通常位于同一本地网络甚至同一服务器上。网络性能和大型数据集通常不是限制因素。相反,在返回数据之前对数据进行排序的成本最高。您可以通过针对这些排序进行优化来获得最大的好处,例如通过创建与您的查询匹配的索引。
【讨论】:
EXPLAIN
通常会忽略 LIMIT
。所以,不要依赖它来提供帮助。以上是关于具有查询性能的 MySQL 限制语法的主要内容,如果未能解决你的问题,请参考以下文章