我有一个拥有大约6000万条记录的mysql数据库。我必须每天生成报告。
我有两种类型的sql语句。
方法1
SELECT TransferStatus as Transfer_Status, count(ID) as Count
FROM calldetails
WHERE YEAR(IVRStartTime) = '2015' AND MONTH(IVRStartTime) = '11' AND DAy(IVRStartTime)='05' AND CallTransfer LIKE '163%'
GROUP BY TransferStatus;
方法2
SELECT TransferStatus as Transfer_Status,
count(ID) as Count FROM calldetails
WHERE (IVRStartTime BETWEEN '2015-11-05 00.00.00' AND '2015-11-05 23.59.59')
AND CallTransfer LIKE '163%'
GROUP BY TransferStatus
我尝试了两个查询都需要大约15分钟才能得出结果。我的问题是哪一个最好用,有没有其他方法可以改善性能。
答案 0 :(得分:3)
只需使用DATE函数返回日期时间值的日期部分
SELECT TransferStatus as Transfer_Status,
count(ID) as Count FROM calldetails
WHERE DATE(IVRStartTime) = DATE('2015-11-05')
AND CallTransfer LIKE '163%'
GROUP BY TransferStatus
这对于处理日期条件会更有效。
您需要使用EXPLAIN来查看执行计划是什么,以便您可以使用索引对其进行优化以加快查询速度
答案 1 :(得分:2)
使用BETWEEN
最佳方法
SELECT TransferStatus as Transfer_Status,
count(ID) as Count FROM calldetails
WHERE (IVRStartTime BETWEEN '2015-11-05 00.00.00' AND '2015-11-05 23.59.59')
AND CallTransfer LIKE '163%'
GROUP BY TransferStatus
这个是最好的,因为BETWEEN
比较多个where子句
或使用index
始终是一个好习惯,因为: -
数据库index
是improves
表中speed
个操作的数据结构。可以使用一列或多列创建索引,为快速随机查找和efficient
ordering
访问记录提供基础。