0
我們有一個MongoDB NoSQL數據庫,它包含一些數據。目前該數據庫包含10M行。默認的_id字段被用作主鍵。 我們集合了三個變量:MongoDb使用索引緩慢查詢
- _id
- 時間戳(索引:1)
- 變量1(索引:1,CompoundIndex與時間戳)
- 變量2
- Variable3
我們希望將時間戳和變量1結合起來查詢。 我們有一個時間戳和變量1的索引。另外,即使對於範圍查詢這是不正確的,我們也有一個複合索引(Timestamp,Variable1)。
沒有當我們有像下面這樣的查詢時,性能非常差(~1分鐘的執行時間)。
實例查詢:
db.getCollection('XXX').find({$and:[
{timestamp:{$lte:1424195749000}},
{timestamp:{$gte:1424195649000}},
{Variable1:1}
]})
查詢中使用僅約在變量1場運行(100毫秒)。
getIndexes():
{
"0" : {
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "XXXXXX_DB.XXXData"
},
"1" : {
"v" : 1,
"key" : {
"timestamp" : 1.0000000000000000
},
"name" : "timestamp_1",
"ns" : "XXXXXX_DB.XXXData"
},
"2" : {
"v" : 1,
"key" : {
"timestamp" : -1.0000000000000000
},
"name" : "timestamp_-1",
"ns" : "XXXXXX_DB.XXXData"
},
"3" : {
"v" : 1,
"key" : {
"variable1" : 1.0000000000000000
},
"name" : "variable1_1",
"ns" : "XXXXXX_DB.XXXData"
},
"4" : {
"v" : 1,
"key" : {
"timestamp" : 1.0000000000000000,
"variable1" : 1.0000000000000000
},
"name" : "timestamp_1_variable1_1",
"ns" : "XXXXXX_DB.XXXData"
}
}
您使用的是哪個版本的MongoDB?如果3.0或更高版本,您是否可以包含[explain]的結果(http://docs.mongodb.org/manual/reference/method/cursor.explain/#cursor.explain)? – marijnz0r
你可以在你的集合上發佈'getIndexes()'的結果嗎? – bagrat
FWIW,使用MongoDB 3.0進行小規模測試時。2,獲勝計劃使用索引'timestamp_1'和拒絕索引'Variable1_1'和'timestamp_1_Variable1_1'。在'{Variable1:1,timestamp:1}'上添加複合索引時,後者成爲贏家。 –