geändert wird Ich habe folgende SQL-Code:MySQL SELECT läuft immer verbinden, wenn
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;
, die aus und gibt Zeilen in weniger als 1 Sekunde. Allerdings, wenn ich zu einem left outer
kommen die gerade ändern:
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;
die Abfrage ausgeführt wird für immer und verwendet ~ 100% der CPU des Servers.
Ich lief explain
auf beiden Abfragen und die erste trifft den event_time
Index auf vicidial_agent_log
, während der zweite alle Indizes ignoriert. Es gibt einen Index für call_log.uniqueid
.
vicidial_agent_log
enthält ~ 41.000 Zeilen, call_log
enthält ~ 43.000.
Meine Frage ist also - warum trifft MySQL nicht die Indizes, die ich definiert habe, gibt es eine Möglichkeit, dies zu erzwingen, und wenn nicht, wie kann ich diese Abfrage mit einer akzeptablen Geschwindigkeit ausführen lassen?
bearbeiten
Voll Lösung:
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;
Dies zu akzeptieren als die Antwort lesen, da dieser Code am schnellsten läuft und noch intuitiv zu lesen. Aber Quassnois Antwort und Kommentare sind auch sehr nützlich. –