MySQLがクエリを処理するときに最初に来るのはどれですか?
例:
SELECT pageRegions
FROM pageRegions WHERE(pageID=?) AND(published=true) AND (publishedOn<=?)
ORDER BY publishedON DESC
LIMIT 1';
レコードが改訂日時と一致しなくても、ORDER BYの後にLIMITが適用されている場合でも、最後に公開されたpageRegionを返しますか?
はい、それはORDER BYの後です。クエリでは、DESC
を順序付けして、結果セットの最初に最大の値を作成し、最初の値を選択するため、publishedOnが最も高いレコードを取得します。
limit
は常に結果収集の最後に適用されるため、order by
の後に適用されます。
すべての句が与えられた場合、処理の順序は次のようになります
したがって、WHERE句のすべての条件に一致する最も近いレコード<= publishedOnを取得します。
MySQLの順序が結果を制限する前に適用される場合を指摘したかっただけです。しかし、これは他のDBには当てはまりません。
たとえば、Oracleは最初に結果を制限し、その結果に順序を適用します。パフォーマンスの観点から考えると理にかなっています。 MySQLでは、実際にはDB全体(> 1000レコード)を注文して2を取得します。