次のSQLコードがあります。
select val.PersonNo,
val.event_time,
clg.number_dialed
from vicidial_agent_log val
join
call_log clg on date_add('1970-01-01 02:00:00', interval clg.uniqueid second) = val.event_time
order by val.event_time desc
limit 100;
これは、1 秒未満で行を実行して返します。ただし、ストレート結合を a に変更するとleft outer
:
select val.PersonNo,
val.event_time,
clg.number_dialed
from vicidial_agent_log val
left outer join
call_log clg on date_add('1970-01-01 02:00:00', interval clg.uniqueid second) = val.event_time
order by val.event_time desc
limit 100;
クエリは永遠に実行され、サーバーの CPU の ~100% を使用します。
私は両方のクエリを実行しましたが、最初のクエリは のインデックスにexplain
ヒットし、2 番目のクエリはすべてのインデックスを無視しました。に索引があります。event_time
vicidial_agent_log
call_log.uniqueid
vicidial_agent_log
~41,000 行をcall_log
含み、 ~43,000 行を含みます。
だから私の質問は - MySQL が私が定義したインデックスにヒットしないのはなぜですか、強制的にそうさせる方法はありますか? そうでない場合、どうすればこのクエリを許容できる速度で実行できますか?
編集
完全なソリューション:
select val.PersonNo,
val.event_time,
cl.number_dialed
from vicidial_agent_log val
left outer join
(select date_add('1970-01-01 02:00:00', interval clg.uniqueid second) as 'converted_date',
number_dialed
from call_log clg) cl ON cl.converted_date = val.event_time
order by val.event_time desc
limit 100;