在LEFT JOIN中有效地使用OR语句

时间:2012-10-01 16:13:45

标签: mysql performance optimization query-optimization

所以我有这个查询

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表中的所有条目,即使nr.vid是该表的主键并且存在b.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, ''

1 个答案:

答案 0 :(得分: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无法理解你的表达式是互斥的。从理论上讲,这个查询应该与你的查询等效。