我们部署了一个基于AJAX的Instant Messenger,它由Comet服务器提供服务.我们要求将已发送的消息存储在数据库中以进行长期存档,以满足法律保留要求.
哪个数据库引擎在此一次写入,从不读取(极少数例外)要求中提供最佳性能?
我们需要至少5000插入/秒.我假设MySQL和PostgreSQL都不能满足这些要求.
有关更高性能解决方案的任何建议?HamsterDB,SQLite,MongoDB ......?
请忽略上面的Benchmark我们内部有一个bug.
我们使用以下列插入1M记录:id(int),status(int),message(140 char,random).所有测试都是在带有500 GB Sata Disk的台式PC i5上使用C++驱动程序完成的.
MongoDB的基准测试:
1M记录插入没有索引
time: 23s, insert/s: 43478
1M记录在Id上插入索引
time: 50s, insert/s: 20000
接下来,我们将1M记录添加到具有Index和1M记录的同一个表中
time: 78s, insert/s: 12820
所有这些都导致了fs上的4gb文件.
MySQL基准测试:
1M记录插入没有索引
time: 49s, insert/s: 20408
1M记录插入索引
time: 56s, insert/s: 17857
接下来,我们将1M记录添加到具有Index和1M记录的同一个表中
time: 56s, insert/s: 17857
完全相同的性能,没有损失mysql的增长
我们看到Mongo在这次测试中吃了大约384 MB Ram,加载了cpu的3个核心,MySQL很满意14 MB并且只加载了1个核心.
Edorian提出了正确的建议,我将做更多的Benchmark,我相信我们可以达到2x四核服务器50K插件/秒.
我认为MySQL将是正确的方法.
如果你永远不会查询数据,那么我根本不会将它存储到数据库中,你永远不会打败将它们写入平面文件的性能.
您可能需要考虑的是缩放问题,当将数据写入平面文件的速度慢时会发生什么,您是否会投资更快的磁盘或其他内容.
另一件需要考虑的事情是如何扩展服务,以便您可以添加更多服务器,而无需协调每个服务器的日志并手动合并它们.
编辑:您写道,您希望在数据库中拥有它,然后我还会考虑安全问题,因为您的服务遭到入侵后会发生什么情况,您希望攻击者能够改变历史记录吗?有什么说的?
将它临时存储到文件中可能更为明智,然后将其转储到异地,如果您的Internet前端被黑客攻击则无法访问该位置.
如果您不需要进行查询,那么数据库就不是您所需要的.使用日志文件.
它仅出于法律原因而存储.
那详细的要求呢?你提到NoSQL解决方案,但是这些不能保证数据真的存储在磁盘上.在PostgreSQL中,一切都是事务安全的,因此您100%确定数据在磁盘上并且可用.(只是不要转向fsync)
速度与您的硬件,配置和应用程序有很大关系.PostgreSQL每秒可以在良好的硬件上插入数千条记录并使用正确的配置,使用相同的硬件但在应用程序中使用简单的愚蠢配置和/或错误的方法可能会非常慢.单个INSERT很慢,单个事务中的许多INSERT都快得多,准备好的语句更快,COPY在你需要速度时也很神奇.由你决定.