gpt4 book ai didi

MySQL 查询效率不高(PHP 搜索)

转载 作者:行者123 更新时间:2023-11-29 12:44:26 25 4
gpt4 key购买 nike

我想向用户显示他按国家/地区前缀调用了多少个电话。

我需要按国家/地区合并结果(因为每个国家/地区代码都有许多城市/地区的子代码)

我当前的查询需要 80 秒才能完成,最重要的是,出于分页目的再次运行查询,以及另一个查询通话总数/时间的查询。

这是一个非常重的数据库(1gb+),每次搜索都需要几分钟才能完成,我想知道是否可以使其更合理。

这是一个SQLfiddle

查询:

SELECT 
sec_to_time(avg(t1.sessiontime)) as aloc,
CONCAT(TRUNCATE(sum(t1.terminatecauseid = 1) * 100 / count(*),1),'%') as asr,
count(t1.terminatecauseid = 1) as calls,
cast(t4.countryprefix as unsigned) as prefix,
t4.countryname as destination,
SEC_TO_TIME(sum(t1.sessiontime)) as duration
FROM
cc_call AS t1
inner join
cc_prefix as t2 ON t1.destination = t2.prefix
inner join
cc_country as t4 ON t1.destination like CONCAT(t4.countryprefix, '%')
WHERE
t1.card_id = '97' AND t1.starttime >= ('2013-04-1')
group by t4.countryprefix
order by duration DESC
LIMIT 0 , 100

这里的想法是迭代所有 cc_country 前缀,并使用 LIKE 查看它们是否与 cc_call 中的“目的地”匹配。同样,这是一个非常大的数据库,有没有更好的方法来执行这个查询?

最佳答案

因此,摆脱 like 的一种解决方案是:

SELECT 
avg(t1.sessiontime) as aloc,
CONCAT(TRUNCATE(sum(t1.terminatecauseid = 1) * 100 / count(*),1),'%') as asr,
count(t1.terminatecauseid = 1) as calls,
t4.countryprefix as prefix,
t4.countryname as destination,
sum(t1.sessiontime) as duration
FROM
cc_call AS t1
inner join
cc_country as t4 ON left(t1.destination,length(t4.countryprefix)) = t4.countryprefix
WHERE
t1.card_id = '97' AND t1.starttime >= ('2013-04-1')
GROUP by t4.countryprefix
ORDER by duration DESC
LIMIT 0 , 100

我还添加了目的地和国家/地区前缀的索引,以可能加快连接速度。

如果我所做的更改确实对您的查询有影响,您必须亲自尝试一下您所拥有的数据。

此外,您还获得了 SQLFiddle here .

以及一些有关查询优化的有用信息 here .

关于MySQL 查询效率不高(PHP 搜索),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25646606/

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