簡體   English   中英

優化慢速MySQL計數查詢和按日分組

[英]Optimize Slow MySQL Count Query & Group by Day

我在以下MySQL MyISAM表中跟蹤網站上的點擊:

CREATE TABLE `track_hits` (
  `hit_id` int(10) unsigned NOT NULL auto_increment,
  `referer` varchar(255) default NULL,
  `referer_checksum` int(10) default NULL,
  `domain_checksum` int(10) default NULL,
  `referer_local` enum('Yes','No') default NULL,
  `request` varchar(255) default NULL,
  `request_checksum` int(10) default NULL,
  `embed_id` int(10) unsigned default NULL,
  `embed_user_id` int(10) unsigned default NULL,
  `embed_campaign_id` int(10) unsigned default NULL,
  `date` datetime default NULL,
  `day_checksum` int(10) default NULL,
  `visit_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`hit_id`),
  KEY `referer_checksum` (`referer_checksum`),
  KEY `date` (`date`),
  KEY `visit_id` (`visit_id`),
  KEY `embed_user_id` (`embed_user_id`),
  KEY `embed_campaign_id` (`embed_campaign_id`),
  KEY `day_checksum` (`day_checksum`),
  KEY `domain_checksum` (`domain_checksum`),
  KEY `embed_id` (`embed_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

該表中有超過500萬行。

我想要在特定日期范圍內每個廣告系列( embed_campaign_id )的每次點擊次數和總數#(基於不同的visit_id )。 我正在使用此查詢執行此操作:

SELECT COUNT(DISTINCT h.`visit_id`) AS `visits`, COUNT(h.`hit_id`) AS `hits`, `date`
FROM (`track_hits` h)
WHERE `h`.`embed_campaign_id` = '31'
AND `h`.`date` >= '2012-10-07 07:00:00'
AND `h`.`date` <= '2012-11-07 07:59:59'
GROUP BY `h`.`day_checksum`

運行大約需要15-25秒。

day_checksum是日期的crc32編碼版本,即“2012-11-07”。 我用DATE(h.date)替換了GROUP BY而沒有增加速度。

EXPLAIN返回:

id  select_type table   type    possible_keys           key                 key_len     ref     rows        extra
1   SIMPLE      h       ref     date,embed_campaign_id  embed_campaign_id   5           const   1648683     Using where; Using filesort

我已經考慮過每天使用匯總表,但該站點已本地化,數據庫中的所有日期都是GMT。 因此,10月7日美國東部時間晚上7點到美國東部時間晚上7點到太平洋標准時間晚上7點到太平洋標准時間下午7點到太平洋標

有沒有辦法加快速度?

每列都有一個索引。 我認為使用復合(多列)索引可以獲得更好的性能。

http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

像這樣的東西:

KEY compositeIndex (embed_campaign_id, date, day_checksum, visit_id, hit_id)

只是一些瘋狂的猜測:

  • 做一個anaylize table
  • 將引擎更改為InnoDB
  • date不在group by ,要么完全將其保留,請將其替換為day_checksum ,要么將其更改為date(date)
  • from (track_hits h)移除大括號
  • 確保,這不是硬件,這是瓶頸

最后,每天15-25秒一次並不是很長時間等待。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM