长时间运行的MYSQL查询、带分组的框架表和视图
我有一个表t_date_interval_30,它是365个日历年日期的笛卡尔乘积,还有一个时间字段以30分钟的间隔递增。我使用它作为挂起调用数据的框架长时间运行的MYSQL查询、带分组的框架表和视图,mysql,indexing,view,left-join,Mysql,Indexing,View,Left Join,我有一个表t_date_interval_30,它是365个日历年日期的笛卡尔乘积,还有一个时间字段以30分钟的间隔递增。我使用它作为挂起调用数据的框架 t_date_interval_30 DATE, DAYNAME, INTERVAL '2013-01-01', 'Tuesday', '00:00:00' '2013-01-01', 'Tuesday', '00:30:00' '2013-01-01', 'Tuesday', '01:00:00' '2013-01-01', 'Tuesday
t_date_interval_30
DATE, DAYNAME, INTERVAL
'2013-01-01', 'Tuesday', '00:00:00'
'2013-01-01', 'Tuesday', '00:30:00'
'2013-01-01', 'Tuesday', '01:00:00'
'2013-01-01', 'Tuesday', '01:30:00'
'2013-01-01', 'Tuesday', '02:00:00'
'2013-01-01', 'Tuesday', '02:30:00'
ETC...
接下来我有一个视图v_call_details,它是呼叫数据的汇总视图。每次启动呼叫会话时,呼叫数据汇总为一行-每个呼叫会话的源可以有多行;i、 例如,呼叫记录从一个目标到另一个目标没有应答,呼叫的每个分支都会增加一个新的记录行
v_call_details
CLIENT, CSQ, SESS_ID, DATE, CALL_START, CONT_DISP, MET_SLA
'Acme','ACME_CSQ','123-123456789-01','2013-01-01','2013-01-01 00:12:34','ABANDONED',TRUE
'Acme','ACME_CSQ','123-123456998-01','2013-01-01','2013-01-01 00:45:02','HANDLED',TRUE
'Acme','ACME_CSQ','123-123457291-01','2013-01-02','2013-01-02 13:31:58','HANDLED',FALSE
ETC...
因此,当我运行下面的查询时,它会花费很长时间
SELECT
cd.`client`,
cd.`csq`,
di.`date`,
di.`dayname`,
di.`interval`,
count(cd.`sess_id`) AS `calls`,
(count(cd.`sess_id`) - sum(IF(cd.`cont_disp` = 'ABANDONED'
AND cd.`met_sla` > 0,
1,
0))) AS `presented`
FROM
t_date_interval_30 di
LEFT JOIN
v_call_details cd ON (di.`date` = cd.`date`
AND di.`interval` = SEC_TO_TIME((TIME_TO_SEC(cd.`call_start`) DIV 1800) * 1800))
WHERE
di.`date` BETWEEN '2013-05-01' AND '2013-05-02'
GROUP BY cd.`csq`, di.`date`, di.`interval`
我从未真正使用过索引(尽管我尝试过在日期值中添加一些,并调用开始值)。当我运行EXPLAIN EXTENDED时,我得到以下结果
id, select_type, table, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1, PRIMARY, di, range, i_date, i_date, 3, , 96, 100.00, Using where; Using temporary; Using filesort
1, PRIMARY, <derived2>, ALL, , , , , 153419, 100.00, ,
2, DERIVED, t_cisco_csq_agent_details, ALL , , , , 161925, 100.00, Using temporary; Using filesort
2, DERIVED, t_lkp_clients, ALL , , , , 56, 100.00, ,
id,选择类型,表格,类型,可能的键,键,键长度,参考,行,过滤,额外
1,主要,di,范围,i_日期,i_日期,3,,96,100.00,使用where;使用临时设备;使用文件排序
1,主,全部,153419100.00,
2,派生的,t_cisco_csq_代理_详细信息,全部、、、161925100.00,使用临时;使用文件排序
2,派生的,t_lkp_客户端,全部,,,,,56,100.00,
如有任何建议,将不胜感激。现在如果我运行查询,返回2天数据的结果大约需要70秒。按照这个速度,做一份90天的报告需要一个半小时。。。我需要找到一种方法来降低这一点。首先,不要假设90天的数据需要2天45倍的工作量。您的查询正在对calldetails表进行完整扫描,这可能需要花费大量精力。MySQL可以通过equijoin将日期条件从
di
传播到cd
。我不确定在这种情况下是否会这样(因为第二个条件)
其次,您使用的是视图。这可能导致无法实际提高性能。您可以尝试,但应该尝试在没有视图的情况下编写查询
我的下一个问题是,这需要多长时间来运行:
select cd.csq, cd.`date`,
SEC_TO_TIME((TIME_TO_SEC(cd.`call_start`) DIV 1800) * 1800)) as interval,
count(*)
from v_call_details cd
WHERE cd.`date` BETWEEN '2013-05-01' AND '2013-05-02';
如果这需要合理的时间,那么测试90天。如果这样做有效,那么您可以先进行聚合,然后再连接回di
表。这只是一个想法。我怀疑真正的性能问题在视图中