我有以下 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;
查询永远运行并使用服务器 CPU 的 ~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;