0

これが理にかなっているかどうか、私は自分自身に尋ねていました:

いくつかのテーブルと結合し、結果をグループ化して(GROUP_CONCAT一部の列で使用するために)、いくつかの結果をフィルターで除外してからHAVING、で並べ替えるクエリがあります。ORDER BY

、はここLIMITでの最後のステートメントです-したがって、基本的に、制限HAVINGは結果を通過するときにのみ有効になりますよね?

私は自分自身に問いかけていました-同じことをしFROMて、すでにその部分を制限している場合はどうなりますか?しかし、それはそれほど単純ではなく、もう少し複雑になります。SUBSELECTLIMIT

意味のある例を思い付くのは難しいです、私には悪い例しかありません:

車には常に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ためです。

4

1 に答える 1

0

from 副選択で制限すると順序が定義されないため、異なる結果が得られます。どちらの場合も 4 行を取得しますが、あるケースでは行 7、14、23、8 を取得し、別のケースでは行 1、2、88、17 を取得する可能性があります。したがって、結果セットを順番に制限することは理にかなっています。たとえば、トラフィックを最小限に抑えることができますが、どこを制限するかによって、異なる行が得られることに注意してください。

編集

明確にした後、from 句で行を事前にフィルター処理することは理にかなっています。これは、結合で処理する行が少なくなるためです。2 番目の制限も便利です。s を使用するとleft join、結果セットで 5 行以上を取得できるからです。

ただし、どちらが優れているかを確認するには、explain select ...両方のクエリを実行してください。次に、両方の選択を比較して、どちらがより効率的かを確認できます。

于 2012-12-06T08:07:57.283 に答える