所以今天我遇到了这个问题,我的MongoDB查询极慢和超时的地方。我发布了这个问题 - MongoDB too many records?,他的建议是正确的,我必须确保索引并删除不区分大小写。我在Mongo shell中试过它,效果很好。
然而,当我通过PHP运行它时,它仍然是相同的:( 然后我意识到查询对“id”(不是_id)字段进行了排序,当我删除它时,事情变得非常快。但有了那种,它真的很慢。我已经在id字段上有一个索引。 这是查询btw:
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}
我不确定我哪里出错了,但我很确定问题是在这里索引。我太慌了,无法理解索引的顺序和字段
答案 0 :(得分:1)
您应该针对您的查询运行explain
,它会帮助您弄清楚发生了什么。
Mongo可能没有使用索引进行过滤和排序。使用$or
时,它可以使用多个索引来匹配选项。但是当你添加sort
时,它可能会使它不能使用可用于过滤的索引。
如果要对查询进行排序,则需要确保排序字段位于要搜索的索引中(最后,或者不能使用它进行排序)。
您也可以通过传递索引提示来加快速度。我不知道您的查询匹配了多少个文档,但如果它是一个小数字并且您确保初始条件符合索引,则_id
上的排序可以快速完成。