供参考,这是我目前的表格:
`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上创建一个索引(我不知道这是否有帮助,因为我正在使用一个函数来改变要分组的数据)
创建分别存储小时和分钟的新字段。
最后一个会导致重复数据,我讨厌这个。但也许这是这种情况下的唯一方法?
或者我应该以某种不同的方式解决这个问题?
答案 0 :(得分:2)
如果经常运行此查询,您可以将计算出的值denormaize放入一个单独的列中(可能是插入/更新时的触发器),然后进行分组。
您对小时和分钟的想法也很好,因为它可以让您将几种不同的方式分组,而不仅仅是几分钟。它仍然是非规范化,但它更通用。
非规范化是好的,只要它是合理的和理解的。