我在负载下测试我的数据库设计,我只需要检索固定数量的行(5000)
我可以指定LIMIT来实现这一点,但是看起来查询会构建匹配的所有行的结果集,然后只返回限制中指定的行数。它是如何实现的?
MySQL是否有读取一行,读取另一行并且在检索第5000个匹配行时基本停止?
答案 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)
答案 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子句,否则无法保证返回结果集中将包含第一个记录。