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

时间:2012-04-06 19:29:03

标签: mysql sql-limit

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

我可以指定LIMIT来实现这一点,但是看起来查询会构建匹配的所有行的结果集,然后只返回限制中指定的行数。它是如何实现的?

MySQL是否有读取一行,读取另一行并且在检索第5000个匹配行时基本停止?

6 个答案:

答案 0 :(得分:24)

MySQL非常聪明,如果你在查询中指定LIMIT 5000,并且可以在不先生成整个结果集的情况下生成该结果,那么它将无法构建整个结果。

例如,以下查询:

SELECT * FROM table ORDER BY column LIMIT 5000

除非table上有索引,否则此查询将需要扫描整个column,在这种情况下,它执行智能操作并使用索引查找{{1}的行}}

答案 1 :(得分:6)

 SELECT * FROM `your_table` LIMIT 0, 5000 

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

 SELECT * FROM `your_table` LIMIT 1001, 5000 

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

此类查询的复杂性为O(LIMIT)(除非您指定顺序)。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

正如我在this article中所解释的那样,每个数据库都定义自己的方式来限制结果集的大小取决于所使用的数据库。

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

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

SELECT
    title
FROM
    post
ORDER BY
    id DESC
LIMIT 50
  

请注意,由于我们在使用ORDER BY子句,否则无法保证返回结果集中将包含第一个记录。