用于查询时间戳的索引优化

时间:2016-05-09 20:10:20

标签: mysql indexing timestamp

SELECT
node_session_seq,
call_start,
YEAR(call_start) AS year,
quarter(call_start) as qtr,
ADDDATE(LAST_DAY(SUBDATE(call_start, INTERVAL 1 MONTH)),1) AS month,
CAST(call_start AS DATE) AS date,
CASE WHEN MAX(queue_time) <= sla AND MAX(cont_disp) = 1 THEN 0 ELSE 1 END AS presented,
CASE WHEN MAX(cont_disp) = 2 THEN 1 ELSE 0 END AS handled,
CASE WHEN MAX(queue_time) <= sla AND MAX(cont_disp = 2) THEN 1 ELSE 0 END AS met_sla,
CASE WHEN MAX(queue_time) > sla AND MAX(cont_disp = 1) THEN 1 ELSE 0 END AS abandoned
FROM
emsupport.t_cisco_csq_ad csq_ad where call_start > '2013-03-30 00:00:00'
GROUP BY node_session_seq

以上是我用于构建用于呼叫报告的datamart的查询。我的问题围绕着性能 - 目前桌面上有5个索引:

  • 主键/ INT(11)自动增量
  • call_start / DATETIME
  • cont_disp / VARCHAR(45) - 有效值为1,2,3,4,99
  • csq_name / VARCHAR(90)/ UNRELATED
  • app_name / VARCHAR(90)/ UNRELATED

我应该只为queue_time和SLA添加索引吗? SLA的时间戳格式为45,60,90,120,200或300,与队列时间相同。队列时间会有很多共同之处;我们的大部分通话音量都以&lt; 60秒目前我在23-25秒内看到大约1000行的表现。这是一个约515k行的部分数据集,总数约为750k。

索引可以解决这个问题吗?或者我还应该做些什么呢?我不是一个DBA,只是一个知道足够多的SQL来获得更多工作的人。

感谢您的帮助 - 哦和PS - 插入性能不是问题。它通过脚本每天完成非工作时间,仅插入新数据。

吉姆

//为表编辑/添加创建语句

CREATE TABLE `t_cisco_csq_ad` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `node_session_seq` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `call_start` datetime DEFAULT NULL,
  `call_end` datetime DEFAULT NULL,
  `cont_disp` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `origin_dn` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `dest_dn` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `called_number` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `app_name` varchar(90) COLLATE utf8_unicode_ci DEFAULT NULL,
  `csq_name` varchar(90) COLLATE utf8_unicode_ci DEFAULT NULL,
  `queue_time` time DEFAULT NULL,
  `agent_name` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `ring_time` time DEFAULT NULL,
  `talk_time` time DEFAULT NULL,
  `work_time` time DEFAULT NULL,
  `isrna` tinyint(1) DEFAULT '0',
  `agent_resourceid` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `sla` time DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `i_call_start` (`call_start`),
  KEY `i_csq_name` (`csq_name`),
  KEY `i_app_name` (`app_name`),
  KEY `i_cont_disp` (`cont_disp`)
ENGINE=InnoDB AUTO_INCREMENT=676886 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

1 个答案:

答案 0 :(得分:0)

唯一有用的索引是INDEX(call_start)

闻起来cont_disp应该是TINYINT UNSIGNED。或者也许ENUM(...)