2011-02-11 16 views
31

¿Cuál viene primero cuando MySQL procesa la consulta?¿Se aplica MySQL LIMIT antes o después de ORDER BY?

Un ejemplo:

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

¿Eso devolver el último pageRegion publicada incluso si el registro no coincide con la fecha y hora de revisión si se aplica límite después de ORDER BY?

Respuesta

28

Sí, es después de la ORDEN POR. Para su consulta, obtendría el registro con el publicado más alto, ya que está ordenando DESC, haciendo que el valor más grande sea el primero en el conjunto de resultados, de los cuales seleccionará el primero.

20

La limit siempre se aplica al final de la recolección de resultados, por lo tanto después de order by.

Dadas todas sus cláusulas, el orden de procesamiento será

  • DE
  • DONDE
  • SELECCIONAR
  • ORDER BY
  • LÍMITE

Así obtendrá la récord más cercano < = publishedOn matching all the condiciones en la cláusula WHERE.

3

Solo quería señalar que en el caso de que se haga un pedido de MySQL antes de limitar los resultados. Pero esto no es cierto para otros DB.

Por ejemplo, Oracle primero limita los resultados y aplica el orden en dichos resultados. Tiene sentido cuando lo piensas desde el punto de vista del rendimiento. En MySQL, en realidad está ordenando todo el DB (> 1000 registros) para obtener 2

+0

. Es bueno saberlo, gracias, @cristian! Tenía curiosidad sobre esto desde una perspectiva de rendimiento. – Alastair

+0

Esta respuesta es hace mucho tiempo. Solo quiero señalar que MySQL pertenece a Oracle al igual que otros Oracle DB (_as of 2015_), y de acuerdo con [esta página de MySQL] (https://dev.mysql.com/doc/refman/5.5/en/limit -optimization.html) no se realiza una exploración de tabla completa tan pronto como use 'LIMIT', ya sea que agregue' ORDER BY' o no. – 1111161171159459134