2011-08-28 45 views
4

我正在研究需要在MySQL表中保存页面的每个视图日志的系统。如果访问者在过去24小时内未访问过该页面,则该视图将仅被记录。我想知道如果这样做会在性能和数据库大小方面造成很大的问题。在每个页面视图中插入数据库行

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

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

这样做会不会有数据库紧张?例如,如果网站的流量飙升(定期执行),则每天可能会触发超过200,000次综合浏览量,这意味着每秒超过2次查询。

回答

6

一般约定是在审计表上没有约束条件(主要的,外部的等),当然不是索引 - 所有上述都会减慢插入。

批量插入将是工作考虑 - 批处理插入以降低数据库所需的连接数量,操作涉及的时间量(一个vs多个)。此外,如果为此写入事务日志 - 尽量减少写入事务日志,因为如果希望能够在某个时间点重新生成数据库,则需要写入IO以影响数据库。

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

+0

清除记录的要点是,那么他们将被提交到一份报告中,并且之后将不再需要他们。 – John

+2

@John:这是你的系统,但能够按月份,年份,时间进行聚合将为你的系统提供更多的价值。 –

+0

那么,这取决于我认为的系统:P但是在这种情况下,确实没有必要在一天后保留数据。谢谢! – John

2

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

但它无法确定没有更多的数据,就像它是您使用,真正的页面加载配送等

+2

+1每秒查询2次是完全不重要的负载。 –

+1

假设数据库也在为网站提供内容,那么比第二个/ etc中的统计信息插入要多得多。 –

-1

硬件我觉得你应该:

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

'INSERT DELAYED'可能不适合在此处进行日志记录,他需要插入的行才能立即对其他会话可见,以防止发生下一次插入 - DELAYED INSERT不会给予任何时间保证 – Crack

+0

唯一键和INSERT DELAYED IGNORE应该修复此问题问题。 –

+1

为什么使用我的ISAM?它锁定整个表达到插入意义插入不能同时发生。 InnoDB使用行级锁定。 –

0

只要确保您的表具有适当的选择索引。数据库管理系统可以承受的远不止这些。

+0

审计表通常是大量插入/等,低读取,所以索引中很少或没有值。并且索引减慢插入... –

+0

如果John想要检查给定的用户是否最近访问了他的网站,并且我没有看到通过cookie完成的指示器,那么他们是必需的 – Crack

-2

你可能会想要确保你的mysql集群已经过优化,并且可能会有压力,只要确保它可以为这样的命中做好准备。

2

几点意见:

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