【问题标题】:Why is full text search of MongoDB shards directly much faster than going through the cluster manager (mongos) instance?为什么直接搜索 MongoDB 分片的全文搜索比通过集群管理器 (mongos) 实例快得多?
【发布时间】:2019-02-06 19:00:16
【问题描述】:

我一直对 MongoDB 中的全文搜索性能非常不满意,因此我一直在寻找开箱即用的解决方案。相对较小的 2500 万个文档集合分布在 8 台强大的机器上(4 个具有冗余的分片),我看到一些查询需要 10 秒。那太可怕了。在云雀上,我尝试了 10 秒直接查询分片,似乎 mongos 将查询串行发送到分片,而不是并行发送。在 4 个分片中,我看到一个分片的搜索时间为 2.5 秒,而其他 3 个分片的搜索时间各不到 2 秒。总共不到 8.5 秒,但通过 mongos 花了 10 秒。掌心。

有人可以确认这些对分片的查询是连续运行的吗?或者提供一些其他的解释?

直接查询分片有哪些陷阱?

我们在 4.0 上,查询看起来像这样:

db.items.aggregate(
[
   { "$match" : {
    "$text" : { "$search" : "search terms"}
      }
   }, 
   { "$project": { "type_id" : 1, "source_id": 1 } },
   { "$facet" : { "types" : [ { "$unwind" : "$type_id"} , { "$sortByCount" : "$type_id"}] , "sources" : [ { "$unwind" : "$source_id"} , { "$sortByCount" : "$source_id"}]}}
]
);

我之前犯了一个错误,这是正在发送的查询有问题。我与一位 MongoDB 专家交谈,并了解了正在发生的事情的很大一部分(我认为),但很高兴看到其他人不得不说什么,以便我可以支付赏金并将其正式公布。

【问题讨论】:

  • 你的 mongo 版本是什么?你的查询是什么样的?它是否使用其他条件而不是 $search,或额外的排序?
  • 更新了描述。
  • 您能否详细介绍一下您是如何创建文本索引的?你的分片是如何组织的?你有副本集(有多少)?
  • 如果知道哪些查询需要更长的时间,您应该检查这些查询是否使用 btreeCursor 使用 db.collectionName.find({Query}).explain()
  • @ChrisSeline 你如何衡量你的查询时间?我很确定 scatter-gather 是并行运行的

标签: mongodb full-text-search sharding


【解决方案1】:

有人可以确认这些对分片的查询是连续运行的吗?要么 提供其他解释?

查询中没有分片键,查询将发送到所有分片并并行处理。但是,所有分片的结果将在主分片合并,因此它会等到最慢的分片返回。

直接查询分片有哪些陷阱?

您可能会包含孤立的文档。通过mongos 查询还检查孤立文档以确保数据一致性。因此,通过mongos 查询比直接从每个分片查询的开销更大。

使用 Robo 3T 的查询时间测量

使用 Robo 3T 无法正确测量查询时间。默认情况下,Robo 3T 返回前 50 个文档。对于驱动程序实现,如果返回的文档数量超过默认批量大小,要检索所有文档,将有getmore 请求跟随到数据库。 Robo 3T 只为您提供第一批,即结果的子集。

要评估您的查询,请将explain('executionStats') 添加到您的查询中。性能损失可能是分片之间的数据传输。由于查询中缺少分片键,所有分片的结果必须在合并之前发送到一个分片。总时间不仅是mongo引擎的查询时间(定位文档),还有文档检索时间。

执行下面的命令,您将看到每个分片的 inputStages 以更好地评估您的查询。

db.items.explain('executionStats').aggregate(
[
   { "$match" : {
    "$text" : { "$search" : "search terms"}
      }
   }, 
   { "$project": { "type_id" : 1, "source_id": 1 } },
   { "$facet" : { "types" : [ { "$unwind" : "$type_id"} , { "$sortByCount" : "$type_id"}] , "sources" : [ { "$unwind" : "$source_id"} , { "$sortByCount" : "$source_id"}]}}
]
);

【讨论】:

    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 2018-11-23
    • 2018-12-19
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2021-10-24
    相关资源
    最近更新 更多