2

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

SELECT * FROM b 
   LEFT JOIN n ON b.id = n.id 
   LEFT JOIN nr ON (b.pid <> 0 AND b.pid = nr.vid) 
        OR (b.pid = 0 AND n.vid = nr.vid)

しかし、そのクエリの EXPLAIN ステートメントは、結合で OR を実行するために、nr.vid がそのテーブルの主キーであり、b にインデックスがある場合でも、nr テーブルのすべてのエントリを検索する必要があることを明らかにします。 .pid および n.vid..

これをより効率的にする方法について何か提案はありますか?

結果の説明

1, 'SIMPLE', 'b', 'ref', 'PRIMARY,r_rID', 'r_rID', '197', 'const,const', 48, 'Using where; Using temporary; Using filesort'
1, 'SIMPLE', 'n', 'eq_ref', 'PRIMARY,nst,nnc,ut,uid', 'PRIMARY', '4', 'b.nid', 1, 'Using where'
1, 'SIMPLE', 'nr', 'ALL', '', '', '', '', 335654, ''
1, 'SIMPLE', 'tn', 'ref', 'nid', 'nid', '4', 'n.nid', 1, ''
4

1 に答える 1

2

よくわかりませんが、役に立つかもしれません:

SELECT * FROM b 
   LEFT JOIN n ON b.id = n.id 
   LEFT JOIN nr as nr1 ON b.pid <> 0 AND b.pid = nr1.vid      
   LEFT JOIN nr as nr2 ON b.pid = 0 AND n.vid = nr2.vid

おそらく、mysql は、式が相互に排他的であることを理解できません。理論的には、このクエリはあなたのものと同等に機能するはずです。

于 2012-10-01T16:27:49.777 に答える