web-dev-qa-db-ja.com

MySQL LIMITはORDER BYの前または後に適用されますか?

MySQLがクエリを処理するときに最初に来るのはどれですか?

例:

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

レコードが改訂日時と一致しなくても、ORDER BYの後にLIMITが適用されている場合でも、最後に公開されたpageRegionを返しますか?

36
Chris Abrams

はい、それはORDER BYの後です。クエリでは、DESCを順序付けして、結果セットの最初に最大の値を作成し、最初の値を選択するため、publishedOnが最も高いレコードを取得します。

33
Marc B

limitは常に結果収集の最後に適用されるため、order byの後に適用されます。

すべての句が与えられた場合、処理の順序は次のようになります

  • から
  • どこ
  • 選択する
  • 注文する
  • 限界

したがって、WHERE句のすべての条件に一致する最も近いレコード<= publishedOnを取得します。

24
RichardTheKiwi

MySQLの順序が結果を制限する前に適用される場合を指摘したかっただけです。しかし、これは他のDBには当てはまりません。

たとえば、Oracleは最初に結果を制限し、その結果に順序を適用します。パフォーマンスの観点から考えると理にかなっています。 MySQLでは、実際にはDB全体(> 1000レコード)を注文して2を取得します。

3
Cristian