在每个页面视图上插入数据库行

时间:2011-08-28 21:36:24

标签: php mysql

我正在开发一个系统,需要在MySQL表中记录页面的每个视图。仅当访问者在过去24小时之前未访问该页面时,才会记录该视图。我想知道在性能和数据库大小方面这样做是否会成为一个问题。

需要这样做的网站平均每天有大约60,000个独特的综合浏览量,因此每天大约增加60,000个新行(每2秒不到1个)。该表只有3列:i_idip_addresstimestampi_id是另一个表的外键。

该表将在每天结束时使用CRON脚本清除。

这样做会立即造成数据库紧张吗?例如,如果网站流量激增(它经常发生),一天内可以拍摄超过200,000次综合浏览量,这意味着每秒超过2次查询。

6 个答案:

答案 0 :(得分:6)

一般约定是在审计表上没有约束(主要的,外来的等),当然也没有索引 - 以上所有都会减慢插入速度。

批量插入将起作用 - 考虑批量插入以减少数据库所需的连接数量,操作所涉及的时间量(一对多)。此外,如果为此编写事务日志 - 最小化写入它们,因为如果您希望能够在某个时间点恢复数据库,则需要写入IO可能会影响数据库。

我没有看到在一天结束时清除记录的意义 - 两天内发生的流量怎么样? MySQL partitioning would likely be a better idea

答案 1 :(得分:2)

您的问题不是每天的综合浏览量。您必须考虑在高峰时段每秒需要提供多少次综合浏览量。如果网页浏览量是均匀分布的,并且每秒只有2次综合浏览量,那么在普通的非共享服务器中,这不会是一个问题。

但如果没有更多数据(例如您使用的硬件,实际页面负载分布等),则无法确定。

答案 2 :(得分:2)

一些评论:

  • 确保这是InnoDB表。 MyISAM为每次插入或更新锁定整个表,而InnoDB使用行级锁定。
  • 使用适合每列的最小数值数据类型。
  • 每秒两次查询? MySQL在早餐前每秒吃两次查询。说真的,你应该能够承受数百人。
  • 如果您仍然担心,请确保您使用的是MySQL 5.1或更高版本,因为它可以在InnoDB表中实现更好的并发性。
  • 我希望“外来”键只能通过代码和约定来强制执行,而不是严格限制,因为这会减慢插入速度。

答案 3 :(得分:0)

确保您的表格具有适当的选择索引。数据库管理系统可以承受更多的压力。

答案 4 :(得分:-1)

我认为你应该:

  1. 删除外键。在这种情况下,似乎是多余的。在每个INSERT / UPDATE / DELETE上使用FK时,db会花费额外的资源来检查表数据的完整性。对于记录,没有必要。我们需要性能和快速响应
  2. 使用myisam。 MyIsam引擎更简单,并且不会像在Innodb中那样在事务日志记录,日志记录等不同的事情上花费资源。
  3. 使用INSERT DELAYED插入和刷新索引,不是针对一行而是针对批处理。查看更多信息http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html。在每个插入查询上,db执行一些操作,其中一个是刷新索引。如果您运行20个查询,则将进行20次刷新。 INSERT DELAYED批量选择查询并像一个查询一样运行它们。所以你只有一次冲洗。

答案 5 :(得分:-2)

您可能希望确保您的mysql集群已经过优化,并且可能存在压力,只需确保它可以为此类命中做好准备。