简而言之:当我将具有多个字段的 JSON 对象保存在 MongoDB 的单个字符串字段中或将 JSON 对象的每个字段保存在其自己的 MongoDB 字段中时,插入速度存在巨大差异。1)这种差异正常吗?2) 这些插入速度是典型的吗?
我有许多记录,每个记录都有一个唯一的字符串 id 和 600 个整数值。它们已经在文件中表示为 JSON 对象——每个文档在单独的行中。如果我将 MongoDB 文档表示为整数字段的集合并将我的唯一 id 放入 MongoDB 的字段中,我每秒_id
可以插入大约50 个文档。如果我改为创建一个只有两个字段的文档(对于唯一的字符串 id,以及作为保留整个 JSON 记录行的单个字符串),我每秒可以插入大约 100 个文档。_id
val
我正在使用 Python 客户端并尝试进行批量插入(例如,一次 10、100、1000 个)。差异总是存在的。这种行为是预期的吗?我天真地假设我不会看到差异,因为 MongoDB 本身将记录保存为 BSON,并且在 600 个字段中每个字段都有一个整数或一个包含 JSON 记录的单个字符串之间确实应该没有太大区别,反过来,保留 600 个整数。
附录:1)我在这两种情况下都将 JSON 转换为字典,以确保它不会影响速度测量(即json.loads
和其他东西)。换句话说,在带有 JSON 字符串的单字段的情况下,我会做我在另一种情况下所做的一切,但忽略转换后的字典。
2)我还尝试了空运行,一切都完好无损,没有任何插入到 MongoDB。我每秒可以处理大约 700-800 行。
3)
a. db.test.stats() in single-line-single field case (i.e. fast case):
{
"ns" : "tmp.test",
"count" : 7999,
"size" : 71262392,
"avgObjSize" : 8908.91261407676,
"storageSize" : 88751616,
"numExtents" : 9,
"nindexes" : 1,
"lastExtentSize" : 21742848,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 466944,
"indexSizes" : {
"_id_" : 466944
},
"ok" : 1
}
b. db.test.stats() (each column to a separate case; i.e., slow case):
{
"ns" : "tmp.test",
"count" : 7999,
"size" : 85710500,
"avgObjSize" : 10715.15189398675,
"storageSize" : 107561984,
"numExtents" : 9,
"nindexes" : 1,
"lastExtentSize" : 26091264,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 466944,
"indexSizes" : {
"_id_" : 466944
},
"ok" : 1
}