无写权限下服务工单平均关闭时长MySQL查询优化需求
优化后的MySQL查询方案
你的原查询因为重复执行了相同的筛选条件统计工单数量(外层一次、子查询一次),导致数据库需要两次扫描符合条件的数据,这是性能瓶颈的核心原因。下面是更高效且健壮的写法,仅需一次数据扫描就能完成所有计算:
SELECT COUNT(hd_ticket.id) AS 'Tickets #', ROUND( IFNULL( SUM(TIMESTAMPDIFF(HOUR, hd_ticket.created, hd_ticket.time_closed)) / COUNT(hd_ticket.id), 0 ), 2 ) AS 'AVG Closure Time' FROM hd_ticket LEFT JOIN hd_status ON hd_ticket.hd_status_id = hd_status.id WHERE MONTH(hd_ticket.time_closed) = 12 AND YEAR(hd_ticket.time_closed) = 2017 AND hd_status.state LIKE '%close%' AND hd_ticket.hd_queue_id IN (8)
关键优化细节:
- 消除重复扫描:直接用
SUM()计算所有符合条件工单的关闭时长总和,再除以COUNT()得到平均值,仅需一次遍历数据,比原查询的两次扫描效率提升明显。 - 增强健壮性:加入
IFNULL()处理工单数量为0的极端情况,避免出现除以0的报错(若没有符合条件的工单,平均值会返回0而非抛出错误)。 - 完全兼容原逻辑:保留了你所有的筛选条件和计算规则,只是优化了聚合计算的方式。
如果想进一步挖掘性能潜力,还可以尝试:
- 检查
hd_ticket表的time_closed、hd_queue_id字段是否创建了索引 - 检查
hd_status表的id、state字段是否创建了索引 - 考虑用
DATE_FORMAT(time_closed, '%Y-%m') = '2017-12'替代MONTH()+YEAR()的组合,这样如果time_closed有索引,数据库可以直接利用索引快速筛选数据(效果取决于你的MySQL版本和索引类型)
内容的提问来源于stack exchange,提问作者Sonamor
相关产品推荐
相关产品推荐

