我想知道在选择行后是否执行限制和偏移:
SELECT * FROM users WHERE id > 4 LIMIT 0,90 ORDER BY datetime DESC;
此查询是先选择所有用户的行然后应用LIMIT
,还是先应用LIMIT
然后选择用户的行?
子句首先在FROM
查询中执行,然后是WHERE
子句。之后应用该LIMIT
条款。
因此,以下是您发布的查询的逻辑查询处理步骤:
FROM
子句返回所有用户。WHERE
条款适用。只有具有的用户id > 4
才能进入下一步。LIMIT
。所以你问的问题在这里不太有意义。
您真正应该问的是,“MySQL 是否必须在查询中找到与 WHERE 子句匹配的所有行,或者它是否可以应用 LIMIT 并且最多只需要读取 N 行?”
这里有两种可能的情况,还有一件需要考虑的额外事情,以及您的原始查询存在问题。
所以现在你使用 ORDER BY 有两种可能性。
MySQL 可以使用索引来满足 ORDER BY 子句。在这种情况下,它可以按索引顺序扫描表以查找匹配项,直到满足 LIMIT 为止,然后它将在那里停止读取。这是有效的。
MySQL不能使用索引。然后它必须在应用 LIMIT 之前找到所有可能的匹配项并对整个结果集进行排序。如果有很多行,这通常会很慢。
另外要考虑的是,当您使用带限制的偏移量时,mysql 必须读取所有行直到起始位置,然后才能返回结果。当偏移值非常大时,这会变得非常慢。
这个关于 MySQL 中高效分页的幻灯片解释了很多: http ://www.scribd.com/doc/14683263/Efficient-Pagination-Using-MySQL
选择查询
SELECT * FROM users WHERE id > 4 LIMIT 0,90;
来自http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html
如果将 LIMIT row_count 与 ORDER BY 一起使用,MySQL 会在找到排序结果的第一个 row_count 行后立即结束排序,而不是对整个结果进行排序。如果使用索引进行排序,则速度非常快。如果必须进行文件排序,则必须选择与不带 LIMIT 子句的查询匹配的所有行,并且必须对其中的大部分或全部进行排序,然后才能确定已找到第一个 row_count 行。在任何一种情况下,在找到初始行之后,都不需要对结果集的任何剩余部分进行排序,MySQL 也不会这样做。