我们必须小心区分MongoDB插入事物的成本与首先生成事物的成本,再加上相对于有效负载大小的成本。下面是一个小的矩阵,显示了生成与_id
可选的额外字节有效载荷大小相对的crossed方法。测试仅使用javascript,在MacBook Pro本地主机上进行了100,000次插入操作,使用insertMany
了100个批次(无交易)以尝试消除网络,聊天和其他因素。也进行了两个批处理= 1的运行,只是为了突出显着差异。
Method
A : Simple int: _id:0, _id:1, ...
B : ObjectId _id:ObjectId("5e0e6a804888946fa61a1976"), ...
C : Simple string: _id:"A0", _id:"A1", ...
D : UUID length string _id:"9575edcc-cb70-4d63-97ed-ee5d624de87b0", ...
(but not actually
generated by UUID()
E : Real generated UUID _id: UUID("35992974-21ea-4f61-b715-2dfaed663b73"), ...
(stored UUID() object)
F : Real generated UUID _id: "6b16f733-ff24-4172-83f9-e4f96ace6775"
(stored as string, e.g.
UUID().toString().substr(6,36)
Time in milliseconds to perform 100,000 inserts on fresh (empty) collection.
Extra M E T H O D (Batch = 100)
Payload A B C D E F % drop A to F
-------- ---- ---- ---- ---- ---- ---- ------------
None 2379 2386 2418 2492 3472 4267 80%
512 2934 2928 3048 3128 4151 4870 66%
1024 3249 3309 3375 3390 4847 5237 61%
2048 3953 3832 3987 4342 5448 5888 49%
4096 6299 6343 6199 6449 7634 8640 37%
8192 9716 9292 9397 10816 11212 11321 16%
Extra M E T H O D (Batch = 1)
Payload A B C D E F % drop A to F
-------- ----- ----- ----- ----- ----- -----
None 48006 48419 49136 48757 50649 51280 6.8%
1024 50986 50894 49383 49373 51200 51821 1.2%
这是一个快速的测试,但显然基本字符串和整数_id
的速度大致相同,但是实际上生成UUID会增加时间-特别是如果您使用UUID()
对象的字符串版本,例如UUID().toString().substr(6,36)
,还值得注意的是构造一个ObjectId
外观尽快。