Ç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
Temeldesizin 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);
}
}
}
}
}
}
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
. Kullanılmamış olanları – Jordi
işaretleyin, ilgili bağlantı çok ilginç: http: // jasonwilder.com/blog/2012/02/08/optimizing-mongodb-indexes/ – Jordi