我们部署了一个(基于AJAX的) Instant messenger,它由Comet服务器提供服务。我们要求将发送的邮件存储在数据库中,以便长期存档,以满足法律保留要求。
在这种一次写入、永不读取(极少数例外)的要求中,哪个数据库引擎提供了最佳性能?
我们需要至少5000个插入/秒。我假设MySQL和PostgreSQL都不能满足这些要求。
对更高性能的解决方案有什么建议吗?HamsterDB,SQLite,MongoDB?
发布于 2010-08-19 16:40:42
如果您永远不会查询数据,那么我根本不会将其存储到数据库中,您的性能永远不会超过将它们写入平面文件的性能。
您可能要考虑的是扩展问题,当将数据写入平面文件的速度变慢时会发生什么,您会投资更快的磁盘,还是其他什么。
另一件要考虑的事情是如何扩展服务,以便您可以添加更多的服务器,而不必协调每个服务器的日志并手动合并它们。
编辑:你写过你想要把它放在数据库里,然后我也会考虑把数据放在网上的安全问题,当你的服务被破坏时会发生什么,你希望你的攻击者能够改变所说的历史吗?
更明智的做法是将其临时存储到一个文件中,然后将其转储到一个站点外的位置,如果您的互联网前端遭到黑客攻击,该位置将无法访问。
发布于 2010-08-19 22:46:15
请忽略上面的基准测试,我们里面有一个bug。
我们插入了1M条记录,列如下: id (int),status (int),message (140个字符,随机)。所有测试都是在台式PC i5上使用500 GB Sata磁盘上的C++驱动程序完成的。
使用MongoDB进行基准测试:
1M记录插入不带索引的
time: 23s, insert/s: 434781M记录使用Id上的索引插入
time: 50s, insert/s: 20000接下来,我们将1M条记录添加到具有索引和1M条记录的同一个表中
time: 78s, insert/s: 12820所有这些都会在文件系统上产生接近4 4gb的文件。
使用MySQL进行基准测试:
1M记录插入不带索引的
time: 49s, insert/s: 204081M记录使用索引插入
time: 56s, insert/s: 17857接下来,我们将1M条记录添加到具有索引和1M条记录的同一个表中
time: 56s, insert/s: 17857完全相同的性能,mysql在增长上没有损失
我们看到Mongo在这次测试中消耗了大约384MB的内存,并加载了3个核心,MySQL对14MB感到满意,只加载了1个核心。
Edorian的建议是正确的,我将做更多的基准测试,我相信我们可以达到2倍四核服务器50K插入/秒。
我认为MySQL将是正确的选择。
发布于 2010-08-19 16:39:02
如果你不需要做查询,那么数据库就不是你需要的。使用日志文件。
https://stackoverflow.com/questions/3519972
复制相似问题