考虑一个表 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)
之所以会出现以上假设,是因为处理的顺序会是
您可以将 LIMIT ROW COUNT 与 ORDER BY 结合使用,这会导致 MySQL 在找到排序结果的前 ROW COUNT 行后立即停止排序。 希望这会有所帮助,如果您需要任何说明,请发表评论。
您编写的查询只会获取 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 的袖子里有很多技巧。