需要帮助优化一个sql语句与几个“字段IN(子选择)”OR'd在一起

时间:2013-06-11 14:22:16

标签: mysql sql query-optimization

请告知如何最好地优化此查询。

select count(*)
from table1
where field1 in (select `text` from table2 where id=2)
   or field2 in (select `text` from table2 where id=2)
   or field3 in (select `text` from table2 where id=2);

我的第一个想法是将内部查询的结果选择为逗号分隔值,然后在IN子句中使用csv中的结果。但有没有办法在SQL中完全执行此操作?

2 个答案:

答案 0 :(得分:3)

尝试转换为正确的联接并反转您的表格顺序,以便where id = 2条件可以获得一些牵引力,并使用unionOR拆分为可能允许索引的单独查询使用:

select count(distinct id) from (
    select t.id
    from table2 t2
    join table1 t on t.field1 = t2.`text`
    where t2.id=2
    union
    select t.id
    from grouplists t2
    join table1 t on t.field2 = t2.`text`
    where t2.id=2
    union
    select t.id
    from grouplists t2
    join table1 t on t.field3 = t2.`text`
    where t2.id=2    
)

您经常会发现单独的查询超出单个“或”基础的查询,因为“或”的每个部分都可以使用自己的(最佳)索引。

答案 1 :(得分:1)

我喜欢波希米亚的答案,但我认为这也可以作为另一种选择

SELECT COUNT(DISTINCT table1.id)
FROM table1
LEFT JOIN table2 ON table2.text = table1.field1 
                AND table2.id=2
LEFT JOIN grouplists g1 ON g1.text = table1.field2 
                       AND g1.id=2
LEFT JOIN grouplists g2 ON g2.text = table1.field3 
                       AND g2.id=2
WHERE COALESCE(table2.id, g1.id, g2.id) IS NOT NULL