阅读了几篇关于MongoDB与Cassandra读/写性能的文章。
写
一般来说,当数据非常巨大时,Cassandra的写入性能比MongoDB更好。如下所述:
Cassandra的存储引擎提供恒定时间的写入性能,无论您的数据集增长多快。在MongoDB中,由于基于B树的存储引擎以及每个数据库的写入锁定,写入更为麻烦。
我的问题是: 这个说法现在仍然正确吗?根据我的理解,MongoDB支持按文档而不是按数据库进行锁定,对吗?那么现在Cassandra在写入性能方面是否仍然优于MongoDB?如果是,为什么呢?
读取
一般来说,MongoDB的读取性能优于Cassandra,但我没有找到任何解释,说明MongoDB的读取性能为什么优于Cassandra。
更新:
根据Jared在这个论坛上的答案:
MongoDB的存储引擎比Cassandra更高效。Cassandra的存储引擎在写入方面表现非常出色,因为它以追加方式存储数据。这充分利用了具有较差寻址时间但能够快速执行串行写入的磁盘驱动器。但缺点是,在进行读取时,您通常需要扫描对象的几个版本才能获取最新版本并返回给调用者。MongoDB会就地更新数据。这意味着在处理写入时,它会执行更多的随机IO,但在处理读取时,由于可以通过一个B-tree查找找到磁盘上对象的精确位置,所以读取速度更快。
它帮助我理解Cassandra在删除/编辑现有记录时更快,因为它只需将其附加到末尾,而不是像Mongo一样的原地编辑,需要先搜索然后再进行编辑。这使得Cassandra在写方面比Mongo更好。
但是同样的事情使得Mongo比Cassandra更慢,因为Cassandra必须扫描几个版本的相同记录以获取最新版本才能返回给调用者。
另一个来自blog的原因表明Cassandra在写方面更好。
MongoDB采用“单主”模型,只能在主服务器上进行写入。辅助服务器只能用于读取。因此,如果您有三个节点的副本集,只有主服务器正在进行写入,其他两个节点仅用于读取。这大大限制了写扩展性。您可以部署多个分片,但基本上只有1/3的数据节点可以进行写入。Cassandra采用“多主”模型,可以在任何服务器上进行写入。基本上,您的写扩展性受到群集中服务器数量的限制。群集中的服务器越多,它的扩展性就越好。
从同一blog中可以看到Mongo在读方面优于Cassandra。
二级索引是MongoDB中的一级构造。这使得即使嵌套在MongoDB中存储的对象的属性也很容易进行索引。这使得基于这些二级索引查询变得非常容易。Cassandra仅对二级索引提供了粗略的支持。二级索引还受限于单个列和相等比较。如果您主要将按主键查询,则Cassandra将适合您。