代码之家  ›  专栏  ›  技术社区  ›  NoobEditor

SQL中的ORDER BY/限制执行

  •  0
  • NoobEditor  · 技术社区  · 6 年前

    网上已经有很多线了,只是想理解一些让我困惑的细微差别!

    引用 doc reference

    如果将limit row_count与order by组合,mysql将停止排序为 一旦找到排序结果的第一行\计数行, 而不是对整个结果进行排序。如果通过使用 指数,这很快。

    和A SO thread

    它将先订购,然后得到前20个。数据库也将 在ORDER BY之前处理WHERE子句中的任何内容。

    从问题中提出相同的问题:

    SELECT article
    FROM table1
    ORDER BY publish_date
    LIMIT 20
    

    假设表有2000行,其中 query 现在应该返回20行, MySQL REF ....stops sorting as soon as it has found the first row_count rows.... 当我发现它有点模棱两可的时候,我很困惑!!

    为什么说 stops sorting ?不是吗? limit 正在对通过返回的已排序数据应用子句 order by 子句( 假设其A non-indexed )或者我的理解错误而SQL是 限制 先分类再排序!????

    2 回复  |  直到 6 年前
        1
  •  1
  •   Barmar    6 年前

    文档中提到的优化通常只有在 publish_date 列。这些值按顺序存储在索引中,因此引擎只需遍历列的索引,获取相关的行,直到获取20行。

    如果列没有索引,引擎通常需要获取所有行,对它们排序,然后返回前20行。

    了解它如何与 WHERE 条件。假设查询是:

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

    如果 出版日期 索引和 last_read_date 不是,它将扫描 发布日期 按顺序索引,测试关联的 最新日期 与条件相反,并添加 article 如果测试成功,则返回结果集。当结果集中有20行时,它将停止并返回。

    如果 最新日期 索引和 出版日期 不是,它将使用 最新日期 索引以查找满足条件的所有行的子集。然后它将使用 出版日期 列,并返回该列的前20行。

    如果两列都没有索引,它将执行完整的表扫描以测试 最新日期 ,对符合条件的所有行进行排序,并返回该行的前20行。

        2
  •  1
  •   Shadow    6 年前

    mysql一找到排序结果的第一行就停止排序,而不是对整个结果进行排序

    这实际上是MySQL中非常明智的优化。如果您使用limit返回20行,而mysql知道它已经找到了它们,那么为什么mysql(或您)会关心其余记录的排序方式呢?这无关紧要,因此MySQL停止对其余行进行排序。

    如果order by是在索引列上完成的,那么mysql可以很快地分辨出是否找到了前n条记录。