以下是我根据您的服务器/员工/数据(如果这些服务器是)的建议。由于您使用的是 1 台服务器(和 1 个备份),因此驱动器的容量在一段时间内应该足够了,除非您要在此服务器上存档完整数据。数据可以快速增长,我会考虑增加容量或将数据存档在其他地方。
现在,由于您有很多可以请求报告数据的人,因此主要思想是尽快检索数据,以确保您不会锁定记录(特别是如果您使用myisam表 - 表锁定与具有行级别锁定的innodb)。
明智地使用索引(如果需要,则是唯一的),并使用时间戳尽可能高效地存储数据。
您还可以做的是汇总数据,从而简化查询。虽然,在数据库中并不常见,因为它不尊重正常形式。您可以获得出色的性能,但维护起来很痛苦。
说实话,每分钟运行的cron是可以的,因为您在保存记录时有时间,但是每秒都可以获取数据。我建议确保在获得记录时,将此记录标记为“已处理”或其他状态,以免两次获取此记录。
现在,当您汇总数据时,请确保优化查询,还可以检查说明将输出的内容,然后做出决定。
编辑:汇总数据(不考虑数据库规范化)将获得出色的性能,因为您只查询记录而不使用聚合函数,并且使用最小 where 子句连接表。
例:
98 views on product 1
1 order
21 referral click from clients
2 added to wishlist
可以是:
SELECT
views, orders, referral, whishlist
FROM
summarize_stats_20111201 /* daily table for example */
WHERE
`time` between 1322791200 /*2011-12-01 21:00:00*/ AND 1322791260 /*2011-12-01 21:01:00*/;
views
具有总观看次数,在本例中为 98
orders
具有订单总数,在此示例中为 1
referral
具有推荐的总量,在本例中为 21
wishlist
具有愿望清单的总量,在本例中为 2
这些是汇总表中的计算数据(这就是为什么我说“不尊重数据库规范化”,因为你从不计算RDBMS中的数据),但是如果你立即需要数据,这是你可以做到的一种方式。
编辑2:下面是维护此解决方案的示例:
您有一个维护表的 cronjob。他的工作是为第二天或你需要的任何东西创建桌子。
// in php
$date = date('Ymd', strtotime('+1 day')); // for daily table
$sql = 'CREATE TABLE IF NOT EXISTS the_database.summarize_stats_" . $date . ";
因此,当您插入时,请确保您具有正确的表名,并且使用 ON DUPLICATE KEY
// in php
$sql = 'INSERT INTO TABLE summarize_stats_20111201 SET /* all the fields you need */ ON DUPLICATE KEY views = views + 1;
例如,如果要增加视图
我还忘记了,如果您需要查询1周的数据,则必须创建一个合并表。通过这种方式,您可以执行如下操作:
SELECT
views, orders, referral, whishlist
FROM
summarize_stats_2011 /* yearly merge table for example */
WHERE
`time` between 1322272800 /*2011-11-25 21:00:00*/ AND 1322791260 /*2011-12-01 21:01:00*/;
这样,您就不必进行大量查询。UNION ALL