これが理にかなっているかどうか、私は自分自身に尋ねていました:
いくつかのテーブルと結合し、結果をグループ化して(GROUP_CONCAT
一部の列で使用するために)、いくつかの結果をフィルターで除外してからHAVING
、で並べ替えるクエリがあります。ORDER BY
、はここLIMIT
での最後のステートメントです-したがって、基本的に、制限HAVING
は結果を通過するときにのみ有効になりますよね?
私は自分自身に問いかけていました-同じことをしFROM
て、すでにその部分を制限している場合はどうなりますか?しかし、それはそれほど単純ではなく、もう少し複雑になります。SUBSELECT
LIMIT
意味のある例を思い付くのは難しいです、私には悪い例しかありません:
車には常に4つの車輪があり、すべての車輪には独自のテーブル列があります。したがって、最初の4つのホイールを超えて検索することは意味がありません-MySQLはおそらくそうではないことを私は知っています。したがって、LIMIT 4
の後にあるHAVING
ということは、4番目に停止した可能性がある場合でも、mysqlがテーブル全体(数百万のホイールをリスト)を検索することを意味します。
基本的に、私の質問は-SUBSELECT
以下のクエリで意味がありますか?
なしSUBSELECT
:
SELECT *
FROM carwheel
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT 4
とSUBSELECT
:
SELECT *
FROM (
SELECT *
FROM carwheel
WHERE ... -- (first, simple filter)
LIMIT 4
) AS carwheel
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT 4 -- (does it make sense, to do it twice?)
MySQLは最初の行を見つけた後、それ以上の行を探すのをやめるので、単一の行を期待しているときに追加してもLIMIT 1
、非常に理にかなっていることを読みました。これが、私が副選択について考えている理由です。MySQLはcarwheel
、4番目で停止するのではなく、テーブル全体を調べて、LIMIT
その後にのみ有効になるHAVING
ためです。