当您需要在应用程序中的每个页面视图上记录一些数据时,最有效的解决方案是什么?您应该写入文件还是写入数据库?
或者两者都没有 - 或许您应该将数据缓存在内存或文件中,并且只是偶尔将其写入数据库(或文件系统,如果您使用内存缓存)?
答案 0 :(得分:9)
如果它纯粹记录了少量数据而没有后续查找,那么直接文件I / O几乎可以保证更高效。您正在失去DBMS的所有优势 - 索引,事务完整性(实际上是ACID),并发访问等。
听起来你说的是简单的日志记录。如果是这种情况,并且您不需要对结果数据进行频繁的复杂查询,那么如果性能严重问题,您可能最好使用直接文件I / O.但是要注意并发写入问题。
如果需要RDBMS的属性,您可能会考虑使用SQLite,对于简单的负载而言,它会比大多数RDBMS以更低的开销获得更好的性能,代价是一些好处(高度并发访问和可用性)其他机器的网络是几个“大佬”)。但是,在一般情况下,它仍然不如直接文件I / O快。
你后来提到它是用于页面查看跟踪导致我问:你是在增加一个计数器,而不是记录有关页面视图的数据?如果是这样,我强烈建议选择类似SQLite的东西(做一些像UPDATE tbl SET counter = counter + 1)。你真的不想进入手工操作所涉及的时间问题 - 如果你做得不对,你将开始失去同时访问的计数(A读“100”,B读“100” ,A写“101”,B写“101”; B写应102,但无法知道)。
答案 1 :(得分:4)
从概念上讲,写入数据库总是比写入文件慢。 数据库也必须写入文件,通过额外的通信开销将数据传输到数据库,因此可以将其写入文件。因此,它必须更慢。
也就是说,数据库可以很好地完成磁盘I / O,可能比你更好。如果您发现简单的文件记录器比将其写入数据库要慢,请不要感到惊讶。数据库有很多I / O优化,并且有一些技巧可供您使用(取决于您的网络语言和环境)。
如果答案随着时间的推移而变化,请不要感到惊讶。当您的站点很小时,记录到数据库的速度非常快。随着站点的增长,日志记录表会变得非常痛苦:它占用大量磁盘空间,使备份永久化,并在您尝试查询时消耗所有磁盘I / O.这就是你自己应该对这两种方法进行基准测试然后,当条件发生变化时,您可以在将来重新测试。
答案 2 :(得分:3)
点击数据库很可能比写入文件更昂贵。
如果您的每秒综合浏览量很高,并且数据不需要立即在数据库中提供,那么写入文件并定期将数据加载到数据库中将是更优化的解决方案。
然而,这完全取决于您在每页浏览中记录的数据的性质以及它对其所服务的任何业务功能的重要程度。
答案 3 :(得分:2)
这在很大程度上取决于您对数据安全的需求。如果您在崩溃的情况下可以丢失一些数据,那么将数据保存在内存中并定期写入持久性存储肯定是最有效的方法。
修改:您提到了综合浏览量。在这种情况下,我会将计数器保留在内存中并定期更新数据库表(就像每分钟左右一样)。
答案 4 :(得分:1)
这取决于。
它确实做到了:它取决于您使用的DBMS和/或OS +文件系统。换句话说:你的里程不尽相同。
如果您只是将数据附加到某个地方,现代DBMS / OS +文件系统应该同样好地和快速地处理这个问题。当您想要更改数据时会出现问题。
缓存 - 还取决于您可以承受的缓存粒度类型(需要将每个步骤记录的崩溃安全与潜在的保存相比)。
答案 5 :(得分:0)
使用专为此类内容设计的redis等混合解决方案