MongoDB存储大关键字表查询性能

Posted

技术标签:

【中文标题】MongoDB存储大关键字表查询性能【英文标题】:MongoDB Storing Large Keywords Table Query Performance 【发布时间】:2017-11-24 04:54:22 【问题描述】:

我需要存储一个包含大量关键字对象的集合示例:

 key: "tokyo", someMeta: "meta.." 

db.keyword.createIndex( key: 1 ,  unique: 1 )

我会将它用作查找字典,因此它会被非常频繁地调用。

据我了解,这种查找需要 O(log n) 复杂度,因此它不像从 HashSet O(1) 中查找那么快。

我应该使用此索引查询执行查找,还是应该查询集合中的所有对象,将其放入 HashSet,然后从该哈希集中查找?

假设我在该集合中有超过一百万个对象..

【问题讨论】:

【参考方案1】:

大约一年前,我对同一任务进行了基准测试。瓶颈不是B-tree(因为有些DBMS允许创建HASH-indexes),而是jdbc-driver、网络栈等等。

Java 的本机 Hashmap 比 Oracle/mysql(即使使用内存表)、Postgres、Mongo 快 300-500++ 倍 - 所有这些都位于同一服务器上。

与内存中的 Mysql 相比,Hashmap 占用了两倍 LESS 内存。

对于有 300 万条记录的地图,Hashmap 大约需要 1GB 的 RAM。

此外,令人惊讶的是,Mongo 并不是最快的。我希望 Mongo 在 DBMS 中处于领先地位

内存消耗的赢家是 PostgreSQL 和 MySQL,两者都是 350MB,Mongo 是 650MB。

【讨论】:

您知道从集合中读取 > 一百万个对象并将其存储到静态哈希集中是否会出现任何问题?这个哈希集也需要手动更新。 唯一的问题是缺乏同步。如果您有多个阅读器并且有时会更新此哈希图,他们可能会得到不同的结果。对于 JavaEE,这可以通过制作单例 EJB 并通过 JNDI 访问来解决。 对于单线程任务,hashmap 非常棒。我经常将它们用于内部缓存。那么处理1TB的数据,40GB的HashMap并不少见。当然你应该修改启动选项,例如 java -Xmx50g 会将 java heap 的限制推到 50 GB 我明白了,因为这个哈希集只会用于读取目的,我想它在多线程环境中也可以。我不认为我会有 GB 的关键字 :)

以上是关于MongoDB存储大关键字表查询性能的主要内容,如果未能解决你的问题,请参考以下文章

为啥MongoDB适合大数据的存储

mongodb 数据库

MongoDB应用场景及选型(海量数据存储选型)

sql性能分析(explain关键字)

关于索引

关于索引