今天我遇到了一个问题,我的MongoDB查询非常缓慢并超时。我发布了这个问题 - MongoDB too many records?,他的建议是正确的,我必须确保索引并删除大小写不敏感性。我在Mongo shell中尝试了一下,它完美地工作了。
然而,当我通过PHP运行它时,情况仍然是一样的:(
然后我意识到查询在"id"字段上有一个排序(不是_id),当我去掉它时,事情变得非常快。但是有了排序,它真的很慢。我已经在id字段上有一个索引。
这是查询方式:
所以我的索引是:(非复合)
然而,当我通过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}
我不确定自己哪里做错了,但我很确定这里的问题是索引。我只是太兴奋了,无法理解索引的顺序和字段。
nScanned
数字与n
之间的差异。 - Stennie"key" : { "in_reply_to_screen_name" : 1, "handle" : 1, "created_at" : -1 }
我运行了一个查询$or: ... ... [ ... ... { in_reply_to_screen_name: /^kunalnayyar$/, handle: /^kaleycuoco$/}, ... ... { in_reply_to_screen_name: /^kaleycuoco$/, handle: /^kunalnayyar$/} ... ... ] ... ... ... ... } ).sort({created_at:-1}).explain()
它仍然没有使用索引! - Ayush Chaudhary