在 MySQL 中仅检索固定数量的行

Posted

技术标签:

【中文标题】在 MySQL 中仅检索固定数量的行【英文标题】:Retrieving only a fixed number of rows in MySQL 【发布时间】:2012-04-20 08:32:08 【问题描述】:

我正在负载下测试我的数据库设计,我只需要检索固定数量的行 (5000)

我可以指定一个 LIMIT 来实现这一点,但似乎查询构建了所有匹配行的结果集,然后只返回限制中指定的行数。是这样实现的吗?

mysql 是否有一个读取一行,读取另一行并在检索到第 5000 个匹配行时基本停止的方法?

【问题讨论】:

您可以使用 LIMIT 子句来选择一组行。我不明白您的困惑是什么? 从文档中,如果我理解正确,LIMIT 仅在 SELECT 查询构建结果集后才适用。因此,SELECT 查询会从表中检索所有匹配的行,一旦检索到所有匹配的行,就只返回 LIMIT 子句中指定的行数。我想知道 SELECT 查询是否有办法只检索我想要的行数。 【参考方案1】:
 SELECT * FROM `your_table` LIMIT 0, 5000 

这将显示数据库中的前 5000 个结果。

 SELECT * FROM `your_table` LIMIT 1001, 5000 

这将显示从 1001 到 6000 的记录(从 0 开始计数)。

【讨论】:

【参考方案2】:

此类查询的复杂度为 O(LIMIT)(除非您指定 order by)。

这意味着如果 10000000 行将匹配您的查询,并且您指定的限制等于 5000,那么复杂度将为 O(5000)。

【讨论】:

这是一种简洁的表达方式。谢谢。我的印象是,如果我有那么多匹配的行,SELECT 仍然是 O(1000000),但是 LIMIT 会限制返回给我的结果集的大小。谢谢。【参考方案3】:

MySQL 的聪明之处在于,如果您在查询中指定 LIMIT 5000,并且可以在不首先生成整个结果集的情况下生成该结果,那么它将不会生成整个结果。

例如,以下查询:

SELECT * FROM table ORDER BY column LIMIT 5000

此查询将需要扫描整个 table,除非在 column 上有索引,在这种情况下,它会执行智能操作并使用索引来查找具有最小 column 的行。

【讨论】:

谢谢基思。好吧,我的 SELECT 查询是这样的——从 readings_dev_1 中选择 SQL_NO_CACHE *,其中列在“2012-03-30”和“2012-04-06”之间。如果我要在查询上放置 LIMIT 子句,查询是否足够智能以在 5000 行后停止? 如果我没有对这个选择查询执行 ORDER BY,我还需要这个列的索引吗?我理解如果我要对列进行索引,则需要对它进行排序,以便查询足够智能以在 5000 行后停止。但是,在我的情况下,我不需要返回行的 ORDER。那么我是否正确地假设我不需要该列上的索引并且查询仍然会做聪明的事情并在 5000 行后停止? 它仍然会在 5000 行之后停止,但它可能需要扫描比您的表中更多的行才能找到满足您的范围条件的行。 (无论有没有 LIMIT,这都是一个问题。除非您的大多数行满足范围条件,否则您将需要一个索引。) 是的。没关系。但如果它知道在 5000 行之后停止,那对我来说已经足够了。非常感谢基思。您的回复很有帮助。【参考方案4】:

查询优化器使用的确切计划取决于您的查询(选择了哪些字段、LIMIT 数量以及是否有 ORDER BY)和您的表(键、索引和表中的行数)。选择未索引的列和/或按非键列排序将产生与选择列和按主键列排序不同的执行计划。后者甚至不会触及表格,只会处理您的 LIMIT 中指定的行数。

【讨论】:

【参考方案5】:

@Jarosław Gomułka 是对的 如果将 LIMIT 与 ORDER BY 一起使用,MySQL 会在找到排序结果的第一个 row_count 行后立即结束排序,而不是对整个结果进行排序。如果使用索引进行排序,则速度非常快。在任何一种情况下,在找到初始行之后,都不需要对结果集的任何剩余部分进行排序,MySQL 也不会这样做。 如果该集合未排序,它会在结果集有足够的行后立即终止 SELECT 操作。

【讨论】:

【参考方案6】:

每个数据库定义自己的限制结果集大小的方式取决于您使用的数据库。

虽然 SQL:2008 规范定义了用于限制 SQL 查询的标准语法,但 MySQL 8 不支持它。

因此,在 MySQL 上,您需要使用LIMIT 子句将结果集限制为 Top-N 记录:

SELECT
    title
FROM
    post
ORDER BY
    id DESC
LIMIT 50

请注意,我们使用的是 ORDER BY 子句,否则无法保证返回结果集中包含哪些第一条记录。

【讨论】:

以上是关于在 MySQL 中仅检索固定数量的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在固定数量的部分中有不同的行?

如何破解 MySQL GROUP_CONCAT 以获取有限数量的行?

如何破解 MySQL GROUP_CONCAT 以获取有限数量的行?

在sql server中一次插入固定数量的行2000

在Oracle的SQL查询中获取固定数量的行[重复]

设置固定数量的 y 轴线以在 eCharts 上显示