根据日期格式计算大表的记录

时间:2011-06-22 21:24:00

标签: mysql sql

供参考,这是我目前的表格:

`impression` (
  `impressionid` bigint(19) unsigned NOT NULL AUTO_INCREMENT,
  `creationdate` datetime NOT NULL,
  `ip` int(4) unsigned DEFAULT NULL,
  `canvas2d` tinyint(1) DEFAULT '0',
  `canvas3d` tinyint(1) DEFAULT '0',
  `websockets` tinyint(1) DEFAULT '0',
  `useragentid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`impressionid`),
  UNIQUE KEY `impressionsid_UNIQUE` (`impressionid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=447267 ;

它会记录特定网页上的所有展示次数。经过一天的运行,它已经收集了447266次观看。这些都是很多记录。

现在我想要每分钟的访问量。我可以很容易地得到它们:

SELECT COUNT( impressionid ) AS visits, DATE_FORMAT( creationdate,  '%m-%d %H%i' ) AS DATE
FROM  `impression` 
GROUP BY DATE

这个查询当然需要很长时间。现在大约56秒。

所以我想知道接下来要做什么。我:

  • 在creationdate上创建一个索引(我不知道这是否有帮助,因为我正在使用一个函数来改变要分组的数据)

  • 创建分别存储小时和分钟的新字段。

最后一个会导致重复数据,我讨厌这个。但也许这是这种情况下的唯一方法?

或者我应该以某种不同的方式解决这个问题?

1 个答案:

答案 0 :(得分:2)

如果经常运行此查询,您可以将计算出的值denormaize放入一个单独的列中(可能是插入/更新时的触发器),然后进行分组。

您对小时和分钟的想法也很好,因为它可以让您将几种不同的方式分组,而不仅仅是几分钟。它仍然是非规范化,但它更通用。

非规范化是好的,只要它是合理的和理解的。