gpt4 book ai didi

即使在索引字段上,MongoDB 排序也非常慢

转载 作者:IT老高 更新时间:2023-10-28 12:32:26 32 4
gpt4 key购买 nike

所以我今天遇到了这个问题,我的 MongoDB 查询非常慢并且超时。我发布了这个问题 - MongoDB too many records?他的建议是正确的,我必须确保索引并删除不区分大小写。我在 Mongo shell 中尝试过,效果很好。

但是,当我通过 PHP 运行它时,它仍然是一样的 :(然后我意识到查询对“id”(不是_id)字段进行了排序,当我删除它时,事情变得非常快。但是有了排序,它真的很慢。我已经在 id 字段上有一个索引。这是查询顺便说一句:

db.tweet_data.find({ 
... $or:
... [
... { in_reply_to_screen_name: /^kunalnayyar$/, handle: /^kaleycuoco$/, id: { $gt: 0 } },
... { in_reply_to_screen_name: /^kaleycuoco$/, handle: /^kunalnayyar$/, id: { $gt: 0 } }
... ],
... in_reply_to_status_id_str: { $ne: null }
...
... } ).sort({id:-1})explain()

所以我的索引是:(不是复合的){ {id:-1} , {handle:1}, {in_reply_to_screen_name:1} }经过一番阅读,我意识到它应该是一个复合索引,我尝试了两种变体但没有成功:1. {handle:1, in_reply_to_screen_name:1, id:-1}2. {id:-1,handle:1, in_reply_to_screen_name:1}

我不确定我哪里出错了,但我很确定问题出在此处的索引上。我只是太忙了,无法理解要索引的顺序和字段

最佳答案

你应该对你的查询运行 explain,它会帮助你弄清楚发生了什么。

Mongo 很可能没有使用索引来进行过滤和排序。当您使用 $or 时,它可以使用多个索引来匹配选项。但是,当您添加 sort 时,它可能不会使用可用于过滤的索引。

当您要对查询进行排序时,您需要确保已排序的字段在您要命中的索引中(最后,否则无法使用它进行排序)。

您也可以通过传递索引提示来加快速度。我不知道您的查询匹配多少个文档,但如果它是一个小数字,并且您确保初始条件符合索引,则可以快速完成对 _id 的排序。

关于即使在索引字段上,MongoDB 排序也非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11703716/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com