存储数千个中型文档的最有效的面向文档的数据库引擎是啥?
Posted
技术标签:
【中文标题】存储数千个中型文档的最有效的面向文档的数据库引擎是啥?【英文标题】:What's the most efficient document-oriented database engine to store thousands of medium sized documents?存储数千个中型文档的最有效的面向文档的数据库引擎是什么? 【发布时间】:2011-07-02 17:23:11 【问题描述】:MongoDB 还是 Redis?
我听说我应该在 MongoDB 中保持较小的集合以实现更好的索引(以及适合 RAM 的索引),并且我听说 redis “速度极快”,但如果您有更大的集合,MongoDB 会更好。
如果我有几千个集合,比如几千个哈希,那么最有效的方法是什么?
我之所以这么问,是因为在我的项目中,现在还没有可用的数据进行基准测试还为时过早,而且我可能会设计糟糕的基准测试脚本,因为我不太了解这两个数据库引擎的理论概念,特别是 Redis。
感谢所有回答这个问题的人。
【问题讨论】:
【参考方案1】:这在很大程度上取决于具体的用例。如果您希望能够根据 ID 以外的其他内容查询您的文档,那么您不应该选择 Redis。使用 Redis,您必须实现自己的索引方案,而这是不必要的。
对于我认为您的用例而言,实际上很少有 Redis 会是更好的选择(并不是说 Redis 有什么问题,我经常同时使用 Redis 和 Mongo,但用于不同的事情)。在我看来,您有可以表示为哈希的对象。 Mongo 和 Redis 都可以存储哈希,但 Mongo 可以做的更多。使用 Mongo,您可以在其任何字段上搜索文档,您可以添加索引以加快速度,并且字段甚至不必是字符串,它可以是数字、日期、列表,甚至是文档(或文档列表),并且所有文档都不必放入 RAM 中(尽管当 Redis 的磁盘存储功能完成时这会改变)。 Redis 没有这些。你必须自己实现索引才能进行搜索,除了字符串之外你不能存储任何东西(这有时真的很不方便),除了平面哈希之外你不能存储任何东西(不求助于实现或使用某种映射层如Ohm)。
您还提到了速度。 Redis 速度非常快,Mongo 也不错,但是,对于您的用例,使用 Mongo 可能会更快。请注意,我说 使用 Mongo,并不是说 Mongo 本身会更快。问题是,如果您使用 Redis 并且仍然希望能够使用不是主键的字段来搜索文档,那么正如我上面提到的,您必须自己实现这一点。然后,搜索必须向 Redis 发出至少两个请求,一个用于查找索引,另一个用于获取文档。如果搜索结果包含多个文档,则您必须单独为每个文档提出请求。发出所有这些请求的开销可能会使使用 Redis 比使用 Mongo 更糟糕。根据我的经验,除了最简单的缓存、队列或类似的东西之外,任何东西都需要向 Redis 发出多个请求才能获得所需的一切。
所以,在我掌握的信息有限的情况下,我推荐 MongoDB。
【讨论】:
太棒了!谢谢 :) 我已经阅读了很多关于此的内容,直到现在我才理解键值存储的概念:) 您可以在 Redis 中一次性使用多个命令,而无需网络往返。 这个答案不再相关。 @Frisbetarian:你能解释一下为什么它现在不相关了吗? 因为 Redis 的进步。【参考方案2】:Mongodb 应该没问题:
http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis
【讨论】:
【参考方案3】:文档大小虽然很重要,但不应该是您选择 Mongo 或 Redis 的最重要因素。在 Mongo 中你很少会达到 4MB 的限制,如果你这样做了,这可能表明你的文档没有被充分分解。 Redis 更加通用,因此如果您打算将数据存储用于应用程序状态中的特定领域(建议框、缓存等),Redis 可能更适合。如果持久化更丰富的项目,那些超出 Redis 的原生数据类型和结构的项目,Mongo 可能更适合。
说实话,Redis 和 Mongo 都非常出色,而且启动和运行起来都非常简单。考虑到它处于您生命周期的早期阶段,请尝试两者的尺码,看看哪种感觉更好。
【讨论】:
顺便说一句,MongoDB v1.8rc0 将于 2011 年 2 月下旬发布,现在每个文档的限制为 16Mb。【参考方案4】:我将再向环中添加一个选项:Berkeley DB XML。它是一个占用空间小的 C++ 库,带有提供 XML 数据管理、XQuery 和 XPath 查询的 C++ 和 Java API。它的设计速度非常快、可扩展且可靠。它支持事务、恢复和复制。您可以使用它来存储 XML 文档以及非 SQL 键值对。
免责声明:我是 Berkeley DB 的产品经理,所以我有点偏见。但是,我们有很多客户将 BDB XML 用于大中型文档存储库。
【讨论】:
【参考方案5】:Redis 提出了二级索引,现在可以满足您的目的。 链接:https://redis.io/topics/indexes
【讨论】:
以上是关于存储数千个中型文档的最有效的面向文档的数据库引擎是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Marklogic 数据库中存储名称/值对的最有效方法是啥