2

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

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

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

4

4 回答 4

2

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

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

  • FROM子句返回所有用户。
  • WHERE条款适用。只有具有的用户id > 4才能进入下一步。
  • 然后LIMIT
于 2012-11-03T09:20:41.537 回答
2

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

您真正应该问的是,“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

于 2012-11-03T09:42:25.697 回答
1

选择查询

SELECT * FROM users WHERE id > 4 LIMIT 0,90;
于 2012-11-03T09:22:58.613 回答
1

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

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

主要参考链接

于 2012-11-03T09:23:32.230 回答