2017-09-15 21 views
0

非常に長い時間の後に私が望む値を返すSQLクエリに問題があります。大きな時間応答のSQL

私はタイミング最適化のための私のコードで何を変更することができます?:

select * 
from t1 
where 
(t1.date between '01/01/2016' and '05/01/2016') 
and (t1.section = 'KA') 
and t1.protocol not in (select t2.protocol from t2 where (date between '01/01/2016' and '05/01/2016') and (section = 'KA')) 
+0

t1とt2には何行ありますか? t1&t2の構造は何ですか? – SEarle1986

答えて

1

not existsを使用してみてください:

パフォーマンスを実現するため
select t1.* 
from t1 
where t1.date between '2016-01-01' and '2016-05-01' and 
     t1.section = 'KA' and 
     not exists (select 1 
        from t2 
        where t2.protocol = t1.protocol and 
         t2.date between '2016-01-01' and '2016-05-01' and 
         t2.section = 'KA' 
       ); 

、あなたはt1(section, date, protocol)のインデックスをしたいです。およびt2(protocol, section, date)

+0

ありがとう、男!そのトリックをした。それはなぜothrの陳述で非常に長くかかりますか?お返事ありがとうございます – AnSharp

+0

@AndreaMorello。 。 。クエリを定式化する異なる方法は、異なる実行計画をもたらす可能性がある。 'EXISTS' /' NOT EXISTS'は 'IN' /' NOT IN'よりもMySQLでより良い実行計画を出すことがよくあります。 –