2013-06-12 3 views
0

Монго дб 1.4.1Почему индекс на Number больше, чем на String?

2 коллекции, идентичные данные, но и использовать другой тип данных (Foo - строка, бар - номер) для поля "х":

> db.foo.ensureIndex({x:1}); 
> db.bar.ensureIndex({x:1}); 
> db.foo.stats(); 
{ 
    "ns" : "impressions.foo", 
    "count" : 50000, 
    "size" : 23519184, 
    "avgObjSize" : 470.38368, 
    "storageSize" : 37797888, 
    "numExtents" : 8, 
    "nindexes" : 2, 
    "lastExtentSize" : 15290368, 
    "paddingFactor" : 1, 
    "systemFlags" : 0, 
    "userFlags" : 0, 
    "totalIndexSize" : 2526384, 
    "indexSizes" : { 
     "_id_" : 1463504, 
     "x_1" : 1062880 
    }, 
    "ok" : 1 
} 
> db.bar.stats() 
{ 
    "ns" : "impressions.bar", 
    "count" : 50000, 
    "size" : 21594256, 
    "avgObjSize" : 431.88512, 
    "storageSize" : 22507520, 
    "numExtents" : 7, 
    "nindexes" : 2, 
    "lastExtentSize" : 11325440, 
    "paddingFactor" : 1, 
    "systemFlags" : 0, 
    "userFlags" : 0, 
    "totalIndexSize" : 2730784, 
    "indexSizes" : { 
     "_id_" : 1463504, 
     "x_1" : 1267280 
    }, 
    "ok" : 1 
} 

x_1 больше в случае 2 , тогда как вы ожидали бы противоположного?

+0

Зачем вам ожидать противоположного? –

+0

Я должен признать, что это путаница, я имею в виду, что средний размер объекта меньше, ведь вся статистика меньше для numbner, кроме размера, на самом деле размер не очень хорошо связан с остальными данными в выводе статистики , @DekDekku, вероятно, потому, что для представления чисел требуется меньше байтов, чем строк. – Sammaye

+0

Может быть меньше байтов для представления строки, если строка маленькая (и это меня не удивит, если все строки в коллекции «foo» и «bar»), в то время как числа всегда занимают одинаковое пространство. Но я не могу проверить фактические данные, поэтому ... –

ответ

0

Значение int (или long) в индексах хранится как double в mongodb, которое, как я полагаю, составляет 8 байтов. Таким образом, это может быть причиной большего размера индекса по сравнению со строковым значением.

Проверьте исходный код. https://github.com/mongodb/mongo/blob/v2.2/src/mongo/db/key.cpp#L312

0

Целое число хранится как 16-битовый тип 16, который представляет собой 32-разрядное целое число. Если целое число является категориальным значением, вы можете сохранить строку длиной всего один символ, она должна быть только 8-битной (строка UTF-8).

Смежные вопросы