1

我正在运行一个查询 -

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

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

为什么会这样?

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

如果需要,请提供详细信息:
我的机器有 4 GB RAM
Mysql 5.5 版本。
key_buffer_size = 350M。

这张表有 1.4 亿条记录,有 10 个分区。

谢谢你。

4

1 回答 1

1

你有索引吗

 ( eveDate, msisdn )

这将使它成为一个覆盖索引,而不必转到 ID 的实际数据页,但可以通过 where 子句的“eveDate”部分进行查询优化。

每个反馈的建议。

如果数据是基于日期的,我建议有一个单独的表,其中只有相关日期(或者每小时如果这可能对您的工作更好,因为您说您有一个小时索引)和 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
于 2013-12-09T11:10:09.963 回答