DB具有最佳插入/秒性能?

Nen*_*nad 12 mysql sqlite postgresql mongodb

我们部署了一个基于AJAX的Instant Messenger,它由Comet服务器提供服务.我们要求将已发送的消息存储在数据库中以进行长期存档,以满足法律保留要求.

哪个数据库引擎在此一次写入,从不读取(极少数例外)要求中提供最佳性能?

我们需要至少5000插入/秒.我假设MySQL和PostgreSQL都不能满足这些要求.

有关更高性能解决方案的任何建议?HamsterDB,SQLite,MongoDB ......?

Nen*_*nad 36

请忽略上面的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
Run Code Online (Sandbox Code Playgroud)

1M记录在Id上插入索引

time: 50s, insert/s: 20000
Run Code Online (Sandbox Code Playgroud)

接下来,我们将1M记录添加到具有Index和1M记录的同一个表中

time: 78s, insert/s: 12820
Run Code Online (Sandbox Code Playgroud)

所有这些都导致了fs上的4gb文件.

MySQL基准测试:

1M记录插入没有索引

time: 49s, insert/s: 20408
Run Code Online (Sandbox Code Playgroud)

1M记录插入索引

time: 56s, insert/s: 17857
Run Code Online (Sandbox Code Playgroud)

接下来,我们将1M记录添加到具有Index和1M记录的同一个表中

time: 56s, insert/s: 17857
Run Code Online (Sandbox Code Playgroud)

完全相同的性能,没有损失mysql的增长

我们看到Mongo在这次测试中吃了大约384 MB Ram,加载了cpu的3个核心,MySQL很满意14 MB并且只加载了1个核心.

Edorian提出了正确的建议,我将做更多的Benchmark,我相信我们可以达到2x四核服务器50K插件/秒.

我认为MySQL将是正确的方法.


Ale*_*äll 21

如果你永远不会查询数据,那么我根本不会将它存储到数据库中,你永远不会打败将它们写入平面文件的性能.

您可能需要考虑的是缩放问题,当将数据写入平面文件的速度慢时会发生什么,您是否会投资更快的磁盘或其他内容.

另一件需要考虑的事情是如何扩展服务,以便您可以添加更多服务器,而无需协调每个服务器的日志并手动合并它们.

编辑:您写道,您希望在数据库中拥有它,然后我还会考虑安全问题,因为您的服务遭到入侵后会发生什么情况,您希望攻击者能够改变历史记录吗?有什么说的?

将它临时存储到文件中可能更为明智,然后将其转储到异地,如果您的Internet前端被黑客攻击则无法访问该位置.

  • 实际上,具有日志轮换的日志文件是一个解决的艺术.可靠的数据库扩展只能在高端市场上解决,即便如此,我个人使用它的经验表明它通常配置错误而且工作不正常.平面文件总是会非常快. (2认同)

jmz*_*jmz 10

如果您不需要进行查询,那么数据库就不是您所需要的.使用日志文件.


Fra*_*ens 5

它仅出于法律原因而存储.

那详细的要求呢?你提到NoSQL解决方案,但是这些不能保证数据真的存储在磁盘上.在PostgreSQL中,一切都是事务安全的,因此您100%确定数据在磁盘上并且可用.(只是不要转向fsync)

速度与您的硬件,配置和应用程序有很大关系.PostgreSQL每秒可以在良好的硬件上插入数千条记录并使用正确的配置,使用相同的硬件但在应用程序中使用简单的愚蠢配置和/或错误的方法可能会非常慢.单个INSERT很慢,单个事务中的许多INSERT都快得多,准备好的语句更快,COPY在你需要速度时也很神奇.由你决定.


Bre*_*ley 5

我不知道你为什么要排除 MySQL。它可以每秒处理高插入量。如果您确实想要高插入,请使用带复制的 BLACK HOLE 表类型。它本质上是写入日志文件,最终将其复制到常规数据库表中。您甚至可以在不影响插入速度的情况下查询从站。