在控制台上运行相同的查询需要两次?

时间:2013-12-09 08:16:35

标签: mysql sql performance optimization query-tuning

我正在运行查询 -

SELECT COUNT(DISTINCT c.msisdn) 
FROM cdr c 
WHERE c.evedate>='2013-10-01';

第一次执行时,需要1分钟。但是在第二秒内执行相同的查询需要3分钟。

为什么会这样?

我也发现了与其他查询相同的行为。

如果需要,详情:
我的机器有4 GB RAM
Mysql 5.5版本。
key_buffer_size = 350M。

此表有1.4亿条记录,包含10个分区。

谢谢。

1 个答案:

答案 0 :(得分:1)

你有

的索引吗?
 ( eveDate, msisdn )

这将使其成为覆盖索引,而不必转到ID的实际数据页面,而是由" eveDate"进行查询优化。 where子句的一部分。

建议每个反馈。

如果数据是基于日期的,我建议有一个单独的表,除了有问题的日期之外什么都没有(或者每小时一次,如果这可能对你的工作更好,因为你说你按小时有一个索引)和ID的数量。如果当天的活动不会改变(或很少),那么这张桌子就在那里。即使您每晚运行以更新每天/每小时的计数,例如过去10天,您的后续查询几乎是即时的。

此外,您甚至可能只是在所讨论的表上使用所有这些记录创建触发器。在添加新记录时,它只是对计数器表进行插入/更新,如...

update CountersSummary
   set TotalCount = TotalCount +1
   where eveDate = just date portion of DateTimeValueOfNewRecord
      and eveHour = hour of DateTimeValueOfNewRecord

if the record count updated = 0
   insert into CountersSummary ( eveDate, eveHour, TotalCount )
      values ( just date portion of DateTimeValueOfNewRecord,
               hour of DateTimeValueOfNewRecord,
               1 )
end if