如何为这个PHP / MySQL问题实现最低的服务器资源使用率?

时间:2011-09-30 12:35:36

标签: php mysql

我正在创建一个用户获得点击广告付费的系统,我需要跟踪用户过去7天点击的广告数量。为此,我想出了两种方法:

  1. 对于点击的每个广告,都会在数据库表'ads_clicked'中插入一个条目。每天都会清除超过7天的条目(cronjob脚本)。

  2. 对于点击的每个广告,都会在数据库表'ads_clicked'中插入一个条目。但是,这次每个日志只会在数据库表中保留1天。每个用户都会计算每个用户点击的广告,并保存在一个字段“ck_1”(在“用户”表格中)中,该字段包含昨天点击的广告。还会有ck_2(= 2天前点击的广告),ck_3等,每天都会移动(ck_7 = ck_6,ck_6 = ck_5等)。

  3. 这两种方式都是可能的,但第二种方式需要在每天运行的cronjob脚本中进行UPDATE查询,而第一种方式则不需要。但是,使用第二种方式,可以更容易地显示每个用户在过去7天内点击的广告,因为它只是存储在数据库中用户条目的一部分的字段(ck_1,ck_2等)中,同时使用每当我想要显示过去7天点击的广告时,我需要计算第二种方法(每天计算'ads_clicked'表中的行数)。

    请注意,该网站可能会获得巨大的流量,因此会在“ads_clicked”表格中输入大量条目,因此我需要确定哪种方式最有效。

    提前致谢。

2 个答案:

答案 0 :(得分:0)

如果您想使用选项2,我建议您为用户点击创建一个单独的表,这样,当您使用cron作业进行繁重的处理时,您将无法锁定对users表的访问。

另一件事:不要立即插入点击。您可以通过将这些点击保存在内存缓存(例如memcached)中来执行此操作(如果可以),并且每十分钟左右获取一次这些点击(甚至可以进行一些处理以最小化插入)并将该批点击插入到' ads_clicked'表,只有一个加载峰值而不是几个连续峰值。

答案 1 :(得分:0)

了解每个选项如何使用硬件上的数据进行预处理的唯一真正方法是尝试两种方式并测量结果。 (如果你这样做,请在这里发布更新。)

我不久前创建了一个类似的系统,并选择了类似选项1.这是最简单,最直接的方法。如果你最终确定MySQL插入只是无法处理你试图插入的数据级别,那么用缓存或消息队列或其他一些新奇的东西来替换它应该很容易。