【问题标题】:Counting records of a large table based on date format根据日期格式统计大表的记录
【发布时间】:2011-06-23 05:51:36
【问题描述】:

作为参考,这是我当前的表:

`印象`( `impressionid` bigint(19) unsigned NOT NULL AUTO_INCREMENT, `creationdate` 日期时间不为空, `ip` int(4) 无符号默认 NULL, `canvas2d` tinyint(1) 默认 '0', `canvas3d` tinyint(1) 默认“0”, `websockets` tinyint(1) 默认 '0', `useragentid` int(10) 无符号非空, 主键(`impressionid`), 唯一键`impressionsid_UNIQUE`(`impressionid`) ) 引擎=InnoDB 默认字符集=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 秒。

所以我想知道下一步该怎么做。我:

  • 在创建日期创建一个索引(我不知道这是否有帮助,因为我正在使用一个函数来更改此数据的分组依据)

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

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

或者我应该以不同的方式去做吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    如果您经常运行此查询,您可以将计算值denormaize 放入单独的列(可能通过插入/更新触发器),然后按此分组。

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

    反规范化是可以的,只要它是合理的和被理解的。

    【讨论】:

    • 谢谢,我就是这么做的,结果很疯狂。我添加了年、月、日、小时和分钟字段。即使未编制索引,查询也只需要 0.4 秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2021-04-06
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多