Как вы получаете размер отдельного индекса в MongoDB?

#mongodb

#mongodb

Вопрос:

Я знаю, что могу использовать db.collection.totalIndexSize() для получения общего размера индекса, но мне интересно увидеть размер отдельного индекса.

Поддерживается ли это?

Ответ №1:

Конечно, можно. db.collection.stats().indexSizes это встроенный документ, в котором каждое имя индекса является ключом, а значение представляет собой общий размер индекса в байтах :

 > db.test.stats()
{
        "ns" : "test.test",
         <snip>
        "indexSizes" : {
                "_id_" : 137904592,
                "a_1" : 106925728
        },
        "ok" : 1
}
  

Комментарии:

1. Как мне получить размеры в КБ или МБ?

Ответ №2:

Это простой скрипт для определения индексов, которые занимают больше всего места во всей вашей базе данных:

 var indexesArr = {}
db.getCollectionNames().forEach(function(collection) {
   indexes = db[collection].stats().indexSizes
   for (i in indexes) indexesArr[collection   " - "   i] = indexes[i];
});

var sortable = [], x;
for (x in indexesArr) sortable.push([x, indexesArr[x]])
var pArr = sortable.sort(function(a, b) {return b[1] - a[1]})
for (x in pArr) print( pArr[x][1]   ": "   pArr[x][0] );
  

Ответ №3:

Перечисляя размер индексов для каждой коллекции в конкретной БД, мы можем использовать следующий фрагмент кода:

 use mydb;

var collectionStats = []

// Get the sizes
db.getCollectionNames().forEach(function (collectionName) {
    var collection = db.getCollection(collectionName)
    var collectionIndexSize = collection.totalIndexSize();
    var indexSizeInMB = collectionIndexSize/(1024*1024)
    collectionStats.push({"collection": collectionName, "indexSizeInMB": indexSizeInMB})
});

// Sort on collection name or index size
var reverse = true;
var sortField = "indexSizeInMB";
collectionStats.sort(function (a, b) {
    comparison = a[sortField] - b[sortField];
    if (isNaN(comparison)) comparison = a.collection.localeCompare(b.collection);
    if (reverse) comparison *= -1;
    return comparison;
});undefined;

// Print the collection stats
collectionStats.forEach(function (collection) {
    print(JSON.stringify(collection));
});

// Total size of indexes
print("Total size of indexes: "   db.stats()["indexSize"]/(1024*1024)   " MB");
  

Вы можете изменить значение переменных в приведенном выше фрагменте

 var reverse = true;
var sortField = "indexSizeInMB";
  

чтобы изменить поле сортировки и порядок.

Ответ №4:

Эй, просто добавьте значение в функцию totalIndexSize() как

  • db.collection.totalIndexSize(1)

например

db.test.totalIndexSize(1)