【问题标题】:SQL how limit and offset are executed?SQL中limit和offset是如何执行的?
【发布时间】:2012-10-23 20:25:12
【问题描述】:

我想知道在选择行后是否执行限制和偏移:

SELECT * FROM users WHERE id > 4 LIMIT 0,90 ORDER BY datetime DESC;

此查询是先选择所有用户的行然后应用LIMIT,还是先应用LIMIT 然后选择用户的行?

【问题讨论】:

  • 不使用 LIMIT 和 ORDER BY 意味着您将无法获得可预测的结果。如果你使用 LIMIT 你真的应该定义你想要返回结果的顺序。否则 MySQL 不保证您将实际收到哪些行。

标签: mysql sql select limit where


【解决方案1】:

FROM 子句在查询中首先被执行,然后是 WHERE 子句。之后应用LIMIT 子句。

因此,以下是您发布的查询的逻辑查询处理步骤:

  • FROM 子句返回所有用户。
  • 应用WHERE 子句。只有id > 4 的用户才能进入下一步。
  • 然后LIMIT

【讨论】:

    【解决方案2】:

    选择查询

    SELECT * FROM users WHERE id > 4 LIMIT 0,90;
    

    【讨论】:

      【解决方案3】:

      来自http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html

      如果将 LIMIT row_count 与 ORDER BY 一起使用,MySQL 会在找到排序结果的前 row_count 行后立即结束排序,而不是对整个结果进行排序。如果使用索引进行排序,则速度非常快。如果必须进行文件排序,则必须选择与不带 LIMIT 子句的查询匹配的所有行,并且必须对其中的大部分或全部进行排序,然后才能确定已找到第一个 row_count 行。在任何一种情况下,在找到初始行之后,都不需要对结果集的任何剩余部分进行排序,并且 MySQL 不会这样做。

      Main Reference Link

      【讨论】:

      • MySQL 从不进行部分文件排序。如果它不能使用索引进行排序,它将总是在应用 LIMIT 子句之前对整个结果集进行排序。
      【解决方案4】:

      所以你问的问题在这里不太有意义。

      您真正应该问的是,“MySQL 是否必须找到与查询中的 WHERE 子句匹配的所有行,或者它是否可以应用 LIMIT 并且最多只需要读取 N 行?”

      这里有两种可能的情况,还有一件需要考虑的额外事情,以及您的原始查询存在问题。

      1. 如果您使用的是 LIMIT,则应该使用 ORDER BY。 MySQL 没有“自然”顺序,这意味着您从该查询中实际返回的行是不确定的。这是一件坏事。

      现在您使用 ORDER BY 有两种可能性。

      1. MySQL 可以使用索引来满足 ORDER BY 子句。在这种情况下,它可以按索引顺序扫描表以查找匹配项,直到满足 LIMIT 为止,然后它将在那里停止读取。这很有效。

      2. MySQL 不能使用索引。然后它必须在应用 LIMIT 之前找到所有可能的匹配项并对整个结果集进行排序。如果有很多行,这通常会很慢。

      另外要考虑的是,当您使用带限制的偏移量时,mysql 必须读取所有行直到开始位置,然后才能返回结果。当偏移值非常大时,这会变得非常慢。

      这个关于 MySQL 中高效分页的幻灯片解释了很多: http://www.scribd.com/doc/14683263/Efficient-Pagination-Using-MySQL

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2020-08-19
      • 1970-01-01
      • 2021-05-17
      相关资源
      最近更新 更多