gpt4 book ai didi

sql - 当 join 改变时,MySQL SELECT 永远运行

转载 作者:行者123 更新时间:2023-11-29 01:34:17 24 4
gpt4 key购买 nike

我有以下 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% 的服务器 CPU。

我对两个查询都运行了 explain,第一个查询命中了 vicidial_agent_log 上的 event_time 索引,而第二个查询忽略了所有索引。 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;

最佳答案

当您使用 LEFT JOIN 时,LEFT 表在 MySQL 中始终领先。

在您的初始查询中,MySQL 可以选择将哪个表设为前导,它选择了 clg

现在它无法选择,并且此条件:date_add('1970-01-01 02:00:00', interval clg.uniqueid second) 不可搜索。

date_add('1970-01-01 02:00:00', interval clg.uniqueid second) 上没有索引,MySQL 可以使用它来定位val.event_time 的值。

将您的查询重写为:

SELECT  val.PersonNo,
val.event_time,
clg.number_dialed
FROM vicidial_agent_log val
LEFT OUTER JOIN
call_log clg
ON clg.uniqueid = UNIX_TIMESTAMP(val.event_time) - 7200
ORDER BY
val.event_time desc
LIMIT 100

关于sql - 当 join 改变时,MySQL SELECT 永远运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1335819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com