mysql中的order by/limit执行

wn9m85ua  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(623)

网上已经有很多帖子了,只是想了解一些让我困惑的细微差别!
引用文档引用
如果将limit row\u count与order by结合使用,mysql会在找到排序结果的第一行\u count行后立即停止排序,而不是对整个结果进行排序。如果使用索引进行排序,则速度非常快。
还有一根线
它会先订购,然后得到前20个。数据库还将在order by之前处理where子句中的任何内容。
从问题中提取相同的查询:

SELECT article
FROM table1
ORDER BY publish_date
LIMIT 20

假设这个表有2000行,其中 query 现在,看看mysql ref ....stops sorting as soon as it has found the first row_count rows.... 把我搞糊涂了,因为我觉得有点模棱两可!!
为什么上面写着 stops sorting ? 不是吗 limit 子句应用于通过返回的已排序数据 order by 条款(假设为a) non-indexed 或者我的理解是错误的,sql是错误的 limit 先分类再排序!!??

wa7juj8i

wa7juj8i1#

mysql一旦找到排序结果的第一行,就停止排序,而不是对整个结果进行排序
这实际上是mysql中非常明智的优化。如果您使用limit返回20行,而mysql知道它已经找到了它们,那么mysql(或您)为什么要关心其余记录的排序方式呢?这无关紧要,因此mysql停止对其余行进行排序。
如果orderby是在索引列上完成的,那么mysql可以很快判断是否找到了前n条记录。

oxiaedzo

oxiaedzo2#

文档中提到的优化通常只在 publish_date 列。这些值按顺序存储在索引中,因此引擎只需遍历列的索引,获取关联的行,直到获取了20行。
如果列没有索引,引擎通常需要获取所有行,对它们进行排序,然后返回其中的前20行。
了解它如何与 WHERE 条件。假设查询是:

SELECT article
FROM table1
WHERE last_read_date > '2018-11-01'
ORDER BY publish_date
LIMIT 20

如果 publish_date 索引和 last_read_date 不是,它将扫描 publish_date 按顺序索引,测试关联的 last_read_date 根据条件,添加 article 如果测试成功,则返回结果集。当结果集中有20行时,它将停止并返回它。
如果 last_read_date 索引和 publish_date 不是,它将使用 last_read_date 索引以查找满足条件的所有行的子集。然后它将使用 publish_date 列,并返回该列的前20行。
如果两个列都没有索引,它将执行一个完整的表扫描来测试 last_read_date ,对所有符合条件的行进行排序,并返回此条件的前20行。

相关问题