2015-11-09 51 views
1

我有一个拥有约6千万条记录的mysql数据库。我将不得不每天生成报告。哪个SQL最适合使用

我有两种类型的sql语句。

方法一

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分钟,得到的结果。我的问题是哪一个最好用,还有什么其他方式可以提高性能。

+2

提示:创建一个合适的索引。 –

+3

第一个是不可控的。因此,即使您在日期列中添加索引,它仍然会很慢。看到这个http://stackoverflow.com/questions/799584/what-makes-a-sql-statement-sargable – thepirat000

+0

为什么关闭?这不是基于意见的,而是基于事实的。投票重新开放。 –

回答

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始终是一个好习惯,因为: -

数据库indeximprovesspeed表中的操作的数据结构。可以使用一列或多列创建索引,为快速随机查找和对记录的访问提供基础。

+0

Tnx。我创建了索引并测试了两个sql语句。这个效果很好,大约需要2分钟,而另一个则需要大约10分钟才能得出结果。 –

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来查看执行计划是什么,这样就可以使用索引对其进行优化来加快查询

+0

编号'DATE(IVRStartTime)'不是可排队的,所以它不会在'IVRStartTime'上使用索引。 –