【问题标题】:running same query on console taking time twice?在控制台上运行相同的查询需要两次时间?
【发布时间】:2013-12-09 08:16:34
【问题描述】:

我正在运行一个查询 -

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

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

为什么会这样?

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

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

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

谢谢。

【问题讨论】:

  • 所以第一次需要1',第二次需要3',反之亦然?
  • 第一次 1 第二次 3 再第三次 3,3,3,3
  • 请在我们的查询上使用 EXPLAIN,然后执行它,然后再次使用 EXPLAIN。我认为优化器会造成严重破坏。 ANALYZE 可能是一个解决方案。

标签: mysql sql performance optimization query-tuning


【解决方案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

【讨论】:

  • 是的,我有相同的索引,也有 - (evedate_hour) 并且在解释计划中它使用相同的索引 (evedate,msisdn) 但仍然需要 3 分钟才能执行。
  • 分区设置如何,每个示例查询截至 2013 年 10 月 1 日有多少条记录...大致
  • 分区基于每周,我有 2,400,000 条记录或每个日期(2013-10-01),我总共有 2 个月的记录,分区基于 evedate。
  • @Aamir0731,根据您的数据量查看修订选项
  • 那么可能是某个计时器进程根据之前的每个小时执行选择 SUM() 吗?几乎任何事情都比每次查询都重新查询 240 万条记录要好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2022-09-17
  • 1970-01-01
相关资源
最近更新 更多