MySQL 限制语法与查询性能
MySQL limit syntax with Query performance
我想知道使用限制语法对查询性能有何影响
有 180000 行。所以我会 select 使用限制语法的数据。
所以我想知道限制语法和查询性能之间的关系。
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
in 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
索引向后扫描并仅检索二十行。
快速衡量任何 SQL 命令的影响的最简单方法是使用 EXPLAIN
并检查行数等。从 EXPLAIN
开始查询通常是好路线。只需在查询前输入 'EXPLAIN ' 即可了解它的价格。
发送大数据集可能不是问题——问题在于排序
根据我的经验,ORDER BY
的使用 非常 慢。出于显而易见的原因,LIMIT
和 ORDER BY
经常一起使用,而且排序较慢,而不是 LIMIT
本身。
LIMIT
确实避免返回可能会被丢弃的大型数据集,但通常在实践中数据库位于同一本地网络甚至同一服务器上。网络性能和大型数据集通常不是限制因素。相反,它是在返回数据之前对数据进行排序的成本最高的。您可以通过针对这些排序进行优化来获得最大收益,例如通过创建与您的查询相匹配的索引。
我想知道使用限制语法对查询性能有何影响 有 180000 行。所以我会 select 使用限制语法的数据。 所以我想知道限制语法和查询性能之间的关系。
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
in 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
索引向后扫描并仅检索二十行。
快速衡量任何 SQL 命令的影响的最简单方法是使用 EXPLAIN
并检查行数等。从 EXPLAIN
开始查询通常是好路线。只需在查询前输入 'EXPLAIN ' 即可了解它的价格。
发送大数据集可能不是问题——问题在于排序
根据我的经验,ORDER BY
的使用 非常 慢。出于显而易见的原因,LIMIT
和 ORDER BY
经常一起使用,而且排序较慢,而不是 LIMIT
本身。
LIMIT
确实避免返回可能会被丢弃的大型数据集,但通常在实践中数据库位于同一本地网络甚至同一服务器上。网络性能和大型数据集通常不是限制因素。相反,它是在返回数据之前对数据进行排序的成本最高的。您可以通过针对这些排序进行优化来获得最大收益,例如通过创建与您的查询相匹配的索引。