0

このクエリを最適化する最善の方法を教えてください。

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 で行う方法はありますか?

4

2 に答える 2

3

適切な結合に変換し、テーブルの順序を反転して、where id = 2条件がある程度の牽引力を得ることができるようにし、使用して、インデックスを使用できるようにする個別のクエリunionに分割します。OR

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    
)

「or」の各部分が独自の (最適な) インデックスを使用できるため、個別のクエリが単一の「or」ベースのクエリよりもパフォーマンスが優れていることがよくあります。

于 2013-06-11T14:37:14.243 に答える
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
于 2013-06-11T14:43:00.233 に答える