长时间运行的MYSQL查询、带分组的框架表和视图

长时间运行的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,它是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', '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
表。这只是一个想法。我怀疑真正的性能问题在视图中