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

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

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

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

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

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

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

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

【问题讨论】:

    标签: java mongodb indexing mongodb-query mongodb-indexes


    【解决方案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 的关键字 :)
    猜你喜欢
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2020-04-27
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多