我想知道在选择行后是否执行限制和偏移:
SELECT * FROM users WHERE id > 4 LIMIT 0,90 ORDER BY datetime DESC;
此查询首先选择所有用户的行然后应用LIMIT
,或者此查询首先应用LIMIT
然后选择用户的行?
答案 0 :(得分:2)
FROM
子句是第一个在查询中执行的子句,然后是WHERE
子句。之后应用LIMIT
子句。
因此,以下是您发布的查询的逻辑查询处理步骤:
FROM
子句返回所有用户。WHERE
子句已应用。只有id > 4
的用户才能进入下一步。LIMIT
。 答案 1 :(得分:2)
所以你问的问题在这里没有意义。
你应该问的是,“MySQL是否必须找到与查询中的WHERE子句匹配的所有行,或者它是否可以应用LIMIT并且只需要读取最多N行?”
这里有两种可能的情况,还有一件需要考虑的事情,以及原始查询的问题。
现在你正在使用ORDER BY,有两种可能性。
MySQL可以使用索引来满足ORDER BY子句。在这种情况下,它可以按索引顺序扫描表,查找匹配,直到满足LIMIT,然后它将停止在那里读取。这很有效。
MySQL 无法使用索引。然后,它必须找到所有可能的匹配并在应用LIMIT之前对整个结果集进行排序。如果有很多行,这通常很慢。
需要考虑的另一件事是,当你使用带限制的偏移量时,mysql必须在返回结果之前读取所有行到起始位置。当偏移值非常大时,这变得非常慢。
这个关于MySQL高效分页的幻灯片解释了很多: http://www.scribd.com/doc/14683263/Efficient-Pagination-Using-MySQL
答案 2 :(得分:1)
选择查询
SELECT * FROM users WHERE id > 4 LIMIT 0,90;
答案 3 :(得分: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也不会这样做。
<强> Main Reference Link 强>