优化限制SQL中要SELECT的行数

问题描述 投票:0回答:2

考虑一个表 Test 有 1000 行

测试台

id   name desc
1    Adi  test1
2    Sam  test2
3    Kal  test3
.
.
1000 Jil test1000

如果我需要获取,假设只有 100 行(即一小部分),那么我在查询中使用

LIMIT
子句

SELECT * FROM test LIMIT 100;

此查询首先获取 1000 行,然后返回其中的 100 行。

是否可以优化,使数据库引擎仅查询 100 行并返回它们

(而不是先获取所有 1000 行然后返回 100)


之所以会出现以上假设,是因为处理的顺序会是

  • 来自
  • 在哪里
  • 选择
  • 订购方式
  • 限制
mysql sql limit rdbms
2个回答
0
投票

您可以将 LIMIT ROW COUNT 与 ORDER BY 结合使用,这会导致 MySQL 在找到排序结果的前 ROW COUNT 行后立即停止排序。 希望这会有所帮助,如果您需要任何说明,请发表评论。


0
投票

您编写的查询只会获取 100 行,而不是 1000 行。但是,如果您以任何方式更改该查询,我的陈述可能是错误的。

GROUP BY
ORDER BY
可能会导致排序,这可以说比全表扫描更慢。在看到
LIMIT
.

之前必须完成那种操作

好吧,并不总是……

 SELECT ... FROM t ORDER BY x LIMIT 100;

INDEX(x)
一起——这可能使用索引并从索引中只获取100行。但是...然后它必须进入数据 100 次才能找到您要求的其他列。除非你只要求
x
.

等等等等

这是另一个问题。这个论坛上有很多问题是“为什么 MySQL 不使用我的索引?”回到你的查询。如果您的表中“只有”1000 行,我的带有

ORDER BY x
的示例将不会使用索引,因为简单地读取整个表会更快,扔掉 90% 的行。另一方面,如果有 9999 行,那么它将使用索引。 (过渡大约是 20%,但这是不精确的。)

迷茫?美好的。让我们一次讨论一个查询。我可以 [可能] 讨论你扔给我的每一个的内容和原因。请务必包括

SHOW CREATE TABLE
、完整的查询和
EXPLAIN SELECT...
这样,我可以解释 EXPLAIN 告诉您(或不告诉您)的内容。

您是否知道同时拥有

GROUP BY
ORDER BY
可能会导致使用 two 排序? EXPLAIN 不会指出这一点。有时有一个简单的技巧可以摆脱其中一种。

MySQL 的袖子里有很多技巧。

© www.soinside.com 2019 - 2024. All rights reserved.