В MongoDb имеется 32-битный тип int (4 байта) и 96-битный тип ObjectId (12 байт). Я заметил, что индекс в 32-битном int-поле больше, чем на поле ObjectId, тогда как я ожидал противоположного по этому вопросу: Are there any tools to estimate index size in MongoDB?Размер индекса MongoDB зависит от размера поля?
Это специфично для ObjectId и как это возможно?
Вот некоторые статистические данные, показывающие разницу, используя MongoDB 3.2.9 и MongoDB-драйвер Java-3.2 с конфигурацией по умолчанию (двигатель WiredTiger + мгновенным уровня сжатия)
"_id" как ObjectId:
> db.objectId.stats()
{
"ns" : "test1.objectId",
"count" : 500000,
"size" : 20500000,
"avgObjSize" : 41,
"storageSize" : 6737920,
[...]
"nindexes" : 1,
"totalIndexSize" : 4300800,
"indexSizes" : {
"_id_" : 4300800
}
}
"_id", как int32 (линейная вставка):
> db.int32linear.stats()
{
"ns" : "test1.int32linear",
"count" : 500000,
"size" : 16500000,
"avgObjSize" : 33,
"storageSize" : 5586944,
[...]
"nindexes" : 1,
"totalIndexSize" : 5255168,
"indexSizes" : {
"_id_" : 5255168
}
}
"_id", как int32 (случайная вставка):
> db.int32random.stats()
{
"ns" : "test1.int32random",
"count" : 500000,
"size" : 16500000,
"avgObjSize" : 33,
"storageSize" : 5595136,
[...]
"nindexes" : 1,
"totalIndexSize" : 5378048,
"indexSizes" : {
"_id_" : 5378048
}
}
Вот код, чтобы воспроизвести тест:
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bson.Document;
public class Main {
public static void main(String[] args) {
List<Document> listDoc = new ArrayList<>();
MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test1");
MongoCollection<Document> objectId = db.getCollection("objectId");
MongoCollection<Document> int32linear = db.getCollection("int32linear");
MongoCollection<Document> int32random = db.getCollection("int32random");
for(int i = 0; i<500000; i++){
listDoc.add(new Document("field", "content"));
}
objectId.insertMany(listDoc);
listDoc.clear();
for (int i = 0; i<500000; i++){
listDoc.add(new Document("_id", i).append("field", "content"));
}
int32linear.insertMany(listDoc);
// unsort the array
Collections.shuffle(listDoc);
int32random.insertMany(listDoc);
mongoClient.close();
}
}
Какой двигатель хранения, WildTiger или mmap? Не ответ, а пара вещей, которые нужно попробовать: рандомизированное вместо упорядоченных значений int и удаление коллекции вместо удаления документов перед тестом, чтобы получить чистую начальную точку, поскольку могут быть свободные списки удаленных распределений, если вы просто удалите все записи. – user3973
Это с двигателем wiredTiger. Я обновил тест в соответствии с вашим комментарием, но все равно получаю те же результаты (см. Мое редактирование). – felix