【问题标题】:How to improve mongodb group query performance如何提高mongodb组查询性能
【发布时间】:2017-06-03 18:46:44
【问题描述】:

我目前正在使用 solr 来存储公共推文信息。我有内容、情绪、关键字、tstamp、语言、tweet_id 等字段来捕捉推文的本质。我也在为相同的用例评估 Mongodb。我正在尝试对具有 一百万条记录的 mongodb 和 solr 进行基准测试。

我观察到 mongodb 中的 group 查询比 solr 的 facet 查询慢 2.5 到 3 倍。

下面的mongodb查询

db.tweets.aggregate(
 [
   {
     $group : {
       _id : "$sentiment", 
       total : { $sum : 1 }
     }
   }
 ]
)

需要 481 毫秒。我在情绪字段上应用了索引。

但是在 solr 中使用 facet 查询同样的事情需要 93 毫秒。

mongodb中是否还有其他配置需要设置以提高mongodb中的组查询性能?

【问题讨论】:

    标签: mongodb solr aggregation-framework


    【解决方案1】:

    $group operation 和构面搜索并不是真正可比的操作,$group 不会使用索引。看起来您正在尝试计算每个不同值 sentiment 的文档数。 MongoDB 对此没有特定的功能。对于特定值,获取计数的更好操作是

    db.collection.count({ "sentiment" : sentiment })
    

    你可以得到所有不同的值

    db.collection.distinct("sentiment")
    

    这两个都可以使用索引{ "sentiment" : 1 }。您将需要多个查询来获取sentiment 的多个值的计数,因此它不如 Solr 方便。分面搜索是全文搜索引擎的核心能力,所以这在 Solr 中比 MongoDB 更容易也就不足为奇了。 MongoDB 和 Solr 意味着完全不同的用途,所以我不能说我明白你为什么要对一个和另一个进行基准测试。这就像船与汽车赛跑。

    【讨论】:

    • 如果一个字段包含say for e.g. 80 个不同的值,那么在这种情况下,上述方法是不可行的。如果我错了,请纠正我。
    • 对。然后你可以使用上面的聚合来找到它,但是这样就不会使用索引了。
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2016-04-06
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多