2012-10-23 23 views
7

Bu basit önek sorgu ile sıkışıp kaldım.Regex ve sort ile Mongodb basit önek sorgu yavaş

940 Millis

: Ben Sonuçları sıralamak çalıştığınızda önek regex biçimini kullanarak oldukça iyi bir performans elde edebilirsiniz Mongo docs durumu (/^a /), sorgu oldukça yavaş olmasına rağmen db.posts.find ({hashtag'ler:/^ noticias /}). sınırı (15), .sort ({sıralaması: -1}).. ipucu ('hashtags_1_rank_-1')()

{ 
"cursor" : "BtreeCursor hashtags_1_rank_-1 multi", 
"isMultiKey" : true, 
"n" : 15, 
"nscannedObjects" : 142691, 
"nscanned" : 142692, 
"nscannedObjectsAllPlans" : 142691, 
"nscannedAllPlans" : 142692, 
"scanAndOrder" : true, 
"indexOnly" : false, 
"nYields" : 1, 
"nChunkSkips" : 0, 
"millis" : 934, 
"indexBounds" : { 
    "hashtags" : [ 
     [ 
      "noticias", 
      "noticiat" 
     ], 
     [ 
      /^noticias/, 
      /^noticias/ 
     ] 
    ], 
    "rank" : [ 
     [ 
      { 
       "$maxElement" : 1 
      }, 
      { 
       "$minElement" : 1 
      } 
     ] 
    ] 
}, 
"server" : "XRTZ048.local:27017" 
} 
açıklar

Ancak, aynı sorgunun sıralanmamış sürümü süper hızlı:

0 Millis

db.posts.find.. ({Hashtag'ler:/^ noticias /}) sınırı (15) .hint ('hashtags_1_rank_-1') açıklar()

: bir çeşit regex ve kaldırırsanız
{ 
"cursor" : "BtreeCursor hashtags_1_rank_-1 multi", 
"isMultiKey" : true, 
"n" : 15, 
"nscannedObjects" : 15, 
"nscanned" : 15, 
"nscannedObjectsAllPlans" : 15, 
"nscannedAllPlans" : 15, 
"scanAndOrder" : false, 
"indexOnly" : false, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"millis" : 0, 
"indexBounds" : { 
    "hashtags" : [ 
     [ 
      "noticias", 
      "noticiat" 
     ], 
     [ 
      /^noticias/, 
      /^noticias/ 
     ] 
    ], 
    "rank" : [ 
     [ 
      { 
       "$maxElement" : 1 
      }, 
      { 
       "$minElement" : 1 
      } 
     ] 
    ] 
}, 
"server" : "XRTZ048.local:27017" 

}

sorgu hızlıdır

0 Millis

db.posts.find ({Hashtag'ler: 'noticias'}) sınırı (15) .sort ({sıralaması: -1}).. Ipucu ('hashtags_1_rank_-1').()

{ 
"cursor" : "BtreeCursor hashtags_1_rank_-1", 
"isMultiKey" : true, 
"n" : 15, 
"nscannedObjects" : 15, 
"nscanned" : 15, 
"nscannedObjectsAllPlans" : 15, 
"nscannedAllPlans" : 15, 
"scanAndOrder" : false, 
"indexOnly" : false, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"millis" : 0, 
"indexBounds" : { 
    "hashtags" : [ 
     [ 
      "noticias", 
      "noticias" 
     ] 
    ], 
    "rank" : [ 
     [ 
      { 
       "$maxElement" : 1 
      }, 
      { 
       "$minElement" : 1 
      } 
     ] 
    ] 
}, 
"server" : "XRTZ048.local:27017" 

}

Bu regex ikisini de kullanarak gibi görünüyor ve sıralama Mongo çok fazla kayıt tarama yapar açıklar. Ancak, düzenli ifadeyi kullanmazsam, sıralama yalnızca 15'i tarıyor. Burada neyin var?

+1

jaime, "scanAndOrder" ın yavaşlıktan sorumlu olduğuna inanıyorum. [Andre'nin cevabı] 'na (http://stackoverflow.com/questions/11871187/removing-scanandorder-true-in-my-mongodb-query-result) bakmak isteyebilirsiniz. konu. – slee

cevap

6

Açıklamasındaki çıktıdaki scanAndOrder: true10 sorgusunun belgeleri almasını ve çıktıları geri gelmeden önce bellekte sıraladığını gösterir. Bu pahalı bir işlemdir ve sorgunuzun performansı üzerinde bir etkisi olacaktır.

'un varlığının yanı sıra nscanned ve n açıklamasındaki fark, çıktının optimal bir dizin kullanmadığını gösterir. Bu durumda bir koleksiyon taraması yapmaya ihtiyaç duyuyor gibi görünüyor. Bu sorunu, sort ölçütünüzdeki dizin anahtarlarını ekleyerek hafifletebilirsiniz. Benim test Gönderen:

db.posts.find({hashtags: /^noticias/ }).limit(15).sort({hashtags:1, rank : -1}).explain() 

bir tarama ve düzeni gerektirir ve n ve aradığınız kayıtların sayısının nscanned döndürür vermez. Bu, sizin için yararlı olabilecek veya olmayabilir, ancak hashtags anahtarında sıralama anlamına gelir, ancak sorgunun performansını artırmanız gerekir.

+0

Teşekkürler, bu gerçekten hile yaptı.Ayrıca, birden fazla eklediğiniz durumda, dizin sınırlarının ilk normal ifadeden çıkarıldığını da belirtmek gerekir. Örneğin, bu sorgu: 'db.posts.find ({" $ ve ": [{hashtags:/^ manana /}, {hashtag: /^noticias/}]}).sort({'hashtags ': 1, 'rank': - 1}). Limit (10) .explain() ' , manana üzerinde dizin sınırlarına sahip olacak ve bu da sizin performansınıza göre farklılık gösterebilir. Benim durumumda, düzenli ifade sorgularını sıralamak alfabetik olarak daha iyi bir performans sağladı – Darius