У меня есть следующий код 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 секунду. Однако, если я изменю прямое соединение на 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;
запрос выполняется вечно и использует ~ 100% ЦП сервера.
Я выполнил explain
по обоим запросам, и первый достиг индекса 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;