运行永远我有以下SQL代码:MySQL的SELECT联接时改变
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;
读取所有的行仍然直观地阅读。但是,Quassnoi的回答和评论也非常有用。 – 2009-08-27 07:29:57