优化慢速MySQL计数查询&;按天分组

优化慢速MySQL计数查询&;按天分组,mysql,count,query-optimization,Mysql,Count,Query Optimization,我正在跟踪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

我正在跟踪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\u campaign\u id
)每天的点击总数和单张总数(基于不同的
visit\u 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`
我曾考虑过每天使用汇总表,但该网站已本地化,数据库中的所有日期均以GMT为单位。因此,东部时间10/07@7PM至11/07@7PM需要返回不同于东部时间10/07@7PM至11/07@7PM的计数


有什么办法可以加快速度吗?

只是一些猜测:

  • 对表格进行分析
  • 将引擎更改为InnoDB
  • date
    不在
    组中,请将其完全删除,替换为
    day\u校验和
    或将两者都更改为
    date(date)
  • 从(轨道h)
  • 确保不是硬件,而是瓶颈

最后,每天15-25秒的等待时间并不长。

每列都有索引。我认为使用复合(多列)索引可以获得更好的性能

大概是这样的:

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

+我说得很好。尽管如此,我还是建议在
where
子句中插入(embed\u campaign\u id,date)。
KEY compositeIndex (embed_campaign_id, date, day_checksum, visit_id, hit_id)