2014-07-02 24 views
9

Çok sayıda veritabanına, koleksiyonları & dizinlerine sahip bir mongodb çoğaltma kümesi var.Bir dizinin kullanılmakta olup olmadığını nasıl kontrol ederim

Çok sayıda refakatçi ve optimizasyon yaptık ve elbette, tüketicilerden çok fazla "yaratıcı sorgu" aldım.

Kullanılmayan dizinleri temizlemek istiyorum. sadece biraz yer kazanmak istiyorum.

İndeks kullanılıyorsa nasıl kontrol edebilirim? İndeksi endeksle kontrol etmeyi ve kullanılmayanları bırakmayı göze alabilirim. komut dinleme cihazı KABUL CEVAP

DAYALI ÇÖZÜM: Bir bütün olası sorgular "açıklamak" Running

bir seçenek :)

DÜZENLEME değildir. Ben bir javascript uzmanı değilim, ama düzeltilmiş senaryoyu koydum. Biri için yararlı olacağını umuyoruz: o zaman

https://github.com/wfreeman/indexalizer

Temelde

sizin veritabanı için profilleme açma içerir ve: Eğer bakmak gerekir Github oldukça serin komut dışarı yoktur

DB.prototype.indexStats = function() { 
    var queries = []; 
    var collections = db.getCollectionNames(); 

    var findQuery = function(q) { 
    for(entryIdx in queries) { 
     if(q == queries[entryIdx].query) { 
     return entryIdx; 
     } 
    } 
    return -1; 
    } 

    for(cIdx in collections) { 
    var cName = collections[cIdx]; 
    var nsName = db.getName()+"."+cName; 
    if(cName.indexOf("system") == -1) { 
     var i = 1; 
     var count = db.system.profile.count({ns:nsName}); 
     print('scanning profile {ns:"'+nsName+'"} with '+count+' records... this could take a while...'); 
     db.system.profile.find({ns:nsName}).addOption(16).batchSize(10000).forEach(function(profileDoc) {   
     if(profileDoc.query && !profileDoc.query["$explain"]) { 
      var qIdx = findQuery(profileDoc.query); 
      if(qIdx == -1 && profileDoc.query["query"]) { 
      var size = queries.push({query:profileDoc.query, count:1, index:""});     
      var explain = db[cName].find(queries[size-1].query).explain(); 
      if(profileDoc.query && profileDoc.query["query"]) { 
       queries[size-1].sort = profileDoc.query["orderby"]; 
       if(queries[size-1].sort) { 
       explain = db[cName].find(queries[size-1].query.query).sort(queries[size-1].sort).explain(); 
       } 
      } 
      queries[size-1].cursor = explain.cursor; 
      queries[size-1].millis = explain.millis; 
      queries[size-1].nscanned = explain.nscanned; 
      queries[size-1].n = explain.n; 
      queries[size-1].scanAndOrder = explain.scanAndOrder ? true : false; 
      if(explain.cursor && explain.cursor != "BasicCursor") { 
       queries[size-1].index = explain.cursor.split(" ")[1];    
      } else { 
       print('warning, no index for query {ns:"'+nsName+'"}: '); 
       printjson(profileDoc.query); 
       print('... millis: ' + queries[size-1].millis); 
       print('... nscanned/n: ' + queries[size-1].nscanned + '/' + queries[size-1].n); 
       print('... scanAndOrder: ' + queries[size-1].scanAndOrder); 
      } 
      } else if (qIdx != -1) { 
      queries[qIdx].count++; 
      } 
     } 
     }); 
    } 
    } 

    for(cIdx in collections) { 
    var cName = collections[cIdx]; 
    if(cName.indexOf("system") == -1) { 
     print('checking for unused indexes in: ' + cName); 
     for(iIdx in db[cName].getIndexes()) { 
     var iName = db[cName].getIndexes()[iIdx].name; 
     if(iName.indexOf("system") == -1) { 
      var stats = db[cName].stats(); 
      var found = false; 
      for(qIdx in queries) { 
      if(queries[qIdx].index == iName) { 
       found = true; 
       break; 
      } 
      } 
      if(!found) { 
      print('this index is not being used: '); 
      printjson(iName); 
      } 
     } 
     } 
    } 
    } 
} 
+0

Eğer sorguları sunucu aslında bazı zaman dilimi içinde aldığı ya da endeksler muhtemelen kullanılamaz, hangi yani gereksiz içinde kullanılmayan hangi endeksleri demek tanım olarak? Birincisi – shx2

+0

. Kullanılmamış olanları – Jordi

+0

işaretleyin, ilgili bağlantı çok ilginç: http: // jasonwilder.com/blog/2012/02/08/optimizing-mongodb-indexes/ – Jordi

cevap

11

açıklama() çağrılarını yürütmek için profiler tarafından toplanan verileri kullanacaktır. Daha sonra hangi indekslerin kullanılmadığını ve hangi sorguların indeks kullanmadığını söyler. Oldukça kaygan.

mongoDB veritabanı profilleme hakkında daha fazla bilgi:

http://docs.mongodb.org/manual/reference/database-profiler/

+0

Sadece bu soru için değil, birçok amaç için yararlı bir cevap. –

28

bu en basit çözüm Mongo konsol koşmak kullanma $indexStats

dahili MongoDB kullanmaktır -

db.collection.aggregate([ { $indexStats: { } } ]) 

PyMongo kullanma -

from pymongo import MongoClient 
collection = MongoClient()[db_name][collection_name] 
index_stats = collection.aggregate([{'$indexStats':{}}]) 

for index_info in index_stats: 
    print index_info 

Eski bir soruyu yeniden açmak için özür dileriz. Bu, Google aramalarının ilk sayfasında görünür ve tek cevap, denetlenmemiş kod snippet'ini kullanmaktır.

+2

Teşekkür ederiz '' '$ indexStats''', oldukça yeni, Mongo 3.2 veya daha geç olduğunu unutmayın. –

+0

çok teşekkür ederim bu çok yardımcı olur –

0

bir koleksiyon endeksleri görüntülemek için basit bir yolu yapmaktır:

db.myCollection.getIndexes() 

daha official documentation

İlgili konular