为啥直接搜索 MongoDB 分片的全文搜索比通过集群管理器 (mongos) 实例快得多?
Posted
技术标签:
【中文标题】为啥直接搜索 MongoDB 分片的全文搜索比通过集群管理器 (mongos) 实例快得多?【英文标题】: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 是并行运行的 【参考方案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"]
]
);
【讨论】:
以上是关于为啥直接搜索 MongoDB 分片的全文搜索比通过集群管理器 (mongos) 实例快得多?的主要内容,如果未能解决你的问题,请参考以下文章