将数据记录到MySQL的最有效方法

时间:2011-02-02 17:40:14

标签: mysql logging

我们有一项服务,全天可以看到数百个同时连接,大约在2000年左右,每天大约300万次点击,并且正在增长。对于每个请求我需要将4或5个数据记录到MySQL,我们最初使用应用程序附带的日志记录但是它非常低效并且将以> 3倍的平均CPU负载运行我的数据库服务器,并且最终让服务器瘫痪。

此时我们要将自己的日志记录添加到应用程序(php),我记录数据的唯一选项是MySQL数据库,因为这是所有http服务器可用的唯一公共资源。这些数据主要是写入,但是我们每天都会根据数据生成报告,然后对旧数据进行处理和归档。

可以提出哪些建议以确保我不会使用记录数据来删除我们的服务?

2 个答案:

答案 0 :(得分:2)

我们针对此问题采取的解决方案是创建archive table然后定期(每15分钟,在应用服务器上)处理数据并将其放回用于生成报告的表中。归档表当然没有任何索引,报告生成的表有几个索引。

这种方法的一些统计数据:

简短版本:>快了360倍

长版:

原始代码/模型确实直接插入到索引表中,平均插入时间为.036秒,使用新代码/模型插入花了不到0.0001秒(我无法获得准确的修复插入时间我必须测量100,000个插入和插入时间的平均值。对于数万条记录,后处理(紧缩)平均需要12秒。总的来说,我们对这种方法非常满意,到目前为止,它对我们来说效果非常好。

答案 1 :(得分:0)

根据您的描述,我建议您尝试利用不需要立即读取此数据并采用“定期批量提交路径”的事实。也就是说,缓存应用服务器上的RAM中的日志记录数据并定期进行批量提交。如果您有多个应用程序节点,某种随机方法可以提供更多帮助(例如,每隔5 +/- 2分钟提交更新的信息)。

这种方法的主要缺点是,如果应用服务器出现故障,您将丢失缓冲数据。但是,如果(a)您绝对需要所有数据并且(b)您的应用服务器经常崩溃,那么这是唯一的错误。很有可能两者都是真的,但是如果它们是真的,你可以简单地将你的缓冲区暂时保存到应用服务器上的本地磁盘上(如果这真的是一个问题。)

主要思想是:

  • 缓冲数据
  • 定期批量提交(在分布式系统中利用某种随机化会有所帮助)

另一种方法是尽可能停止打开和关闭连接(例如,保持更长寿命的连接打开)。虽然这可能是一个良好的第一步,但您可能需要在您可能无法控制的系统的一部分上进行相当多的工作。但如果你这样做,那值得探索。