2

だから私はこのクエリを持っています

EXPLAIN SELECT r.* FROM r_table r
        LEFT JOIN f_table f ON f.id = r.fid
        LEFT JOIN f_table ff ON r.fid = 0 AND r.type = 'f' AND r.id = ff.id
      WHERE (r.fid = 0 AND ff.cid = 421563) OR (r.fid <> 0 AND f.cid = 421563);

そして、テーブルrで全表スキャンを実行しています

出力の説明:

1   SIMPLE      r   ALL Index1              2314    Using where
1   SIMPLE      f   eq_ref  PRIMARY PRIMARY 4   r.fid   1   Using where
1   SIMPLE      ff  eq_ref  PRIMARY PRIMARY 4   r.id    1   Using where

このクエリを変更して、全表スキャンを実行しないようにするにはどうすればよいですか?おそらくUNIONを使用できることはわかっていますが、必要な場合を除いてUNIONは使用したくありません。

編集

クエリをUNIONに書き換えることは実際に機能しました...これがUNIONクエリです

EXPLAIN SELECT r.* FROM r_table r
        LEFT JOIN f_table f ON r.fid <> 0 AND f.id = r.fid
      WHERE f.cid = 421563
UNION SELECT r.* FROM r_table r
        LEFT JOIN f_table ff ON r.fid = 0 AND r.obj_type = 'f' AND r.obj_id = ff.id
      WHERE ff.cid = 421563;

そして出力を説明する

'2', 'UNION', 'ff', 'ref', 'PRIMARY,cid', 'cid', '4', 'const', '2', 'Using where; Using index'
'2', 'UNION', 'r', 'ref', 'Index1,obj_id_type', 'Index1', '13', 'const,const,ff.id', '1', 'Using where'
'1', 'PRIMARY', 'f', 'ref', 'PRIMARY,cid', 'cid', '4', 'const', '2', 'Using where; Using index'
'1', 'PRIMARY', 'r', 'ref', 'Index1', 'Index1', '4', 'f.id', '1', ''
NULL, 'UNION RESULT', '<union1,2>', 'ALL', NULL, NULL, NULL, NULL, NULL, ''

しかし、もう一度、私はこれのためにUNIONをしたくありません

4

1 に答える 1

0

ff.cidとf.cidのフィルターをwhere句からjoinに移動するだけです。実際、左結合を実行しているので、とにかくこれを実行する必要があります。

于 2013-02-25T17:31:19.810 に答える