在LIMDER BY之前或之后应用MySQL LIMIT吗?

Chr*_*ams 36 mysql sql sql-order-by limit

当MySQL处理查询时,哪一个首先出现?

一个例子:

SELECT pageRegions
FROM pageRegions WHERE(pageID=?) AND(published=true) AND (publishedOn<=?)
ORDER BY publishedON DESC
LIMIT 1';
Run Code Online (Sandbox Code Playgroud)

即使记录与ORDER BY后应用的修订日期时间IF LIMIT不匹配,是否会返回上次发布的pageRegion?

Mar*_*c B 33

是的,它是在ORDER BY之后.对于您的查询,您将获得具有最高publishOn的记录,因为您正在订购DESC,在结果集中首先设置最大值,然后从中挑选第一个.


Ric*_*iwi 24

所述limit总是被施加在结果集的结尾,因此之后order by.

鉴于您的所有条款,处理顺序将是

  • 哪里
  • 选择
  • 订购
  • 限制

因此,您将获得与WHERE子句中的所有条件匹配的最接近记录<= publishedOn.


Cri*_*ian 5

只是想指出在限制结果之前应用 MySQL 排序的情况。但对于其他数据库则不然。

例如,Oracle 首先限制结果并对所述结果应用排序。当您从性能角度考虑时,这是有道理的。在 MySQL 中,您实际上是对整个数据库(> 1000 条记录)进行排序以获得 2

  • @1111161171159459134 - 但请注意您链接的页面中的这段引用:*“如果将 LIMIT row_count 与 ORDER BY 结合使用,MySQL 一旦找到排序结果的第一个 row_count 行就会停止排序,而不是对整个结果进行排序。 * *如果使用索引完成排序,速度非常快。如果必须进行文件排序,则选择与不带 LIMIT 子句的查询匹配的所有行,并且在第一个 row_count 之前对其中大部分或全部进行排序**被发现。”* 因此,如果您没有指定顺序的索引,那么它本质上是全表扫描。 (2认同)