2015-05-29 142 views
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" 
    } 
} 
+1

您使用的是哪個版本的MongoDB?如果3.0或更高版本,您是否可以包含[explain]的結果(http://docs.mongodb.org/manual/reference/method/cursor.explain/#cursor.explain)? – marijnz0r

+1

你可以在你的集合上發佈'getIndexes()'的結果嗎? – bagrat

+0

FWIW,使用MongoDB 3.0進行小規模測試時。2,獲勝計劃使用索引'timestamp_1'和拒絕索引'Variable1_1'和'timestamp_1_Variable1_1'。在'{Variable1:1,timestamp:1}'上添加複合索引時,後者成爲贏家。 –

回答

3

你需要{ Variable1: 1, timestamp: 1 }索引來加速該查詢(用大寫V - 您在查詢中使用 「V ariable1」,但你的指數似乎對 「v ariable1」)


鑑於您的查詢:

db.getCollection('XXX').find({$and:[ 
    {timestamp:{$lte:1424195749000}}, 
    {timestamp:{$gte:1424195649000}}, 
    {Variable1:1} 
]}) 

這裏,優化器會看到,你有Variable1平等。所以這個領域是「最有限度的」。所以優化器會選擇一個索引作爲前綴。 { Variable: 1}不應該太糟糕。但{ Variable: 1, timestamp: 1}會更好。

請注意,你有多餘的指標:

  • {timestamp:-1}不會增加太多{timestamp:1}
  • {Variable1: 1}是無用的,如果你有{Variable1: 1, timestamp: 1}
    (因爲前者是後者的前綴)
  • {timestamp: 1}沒用,如果你有{timestamp: 1, Variable1: 1}
    (因爲前者是後者的前綴)