MongoDB 索引数据类型优化,节省60%内存
上一篇 / 下一篇 2011-06-18 10:21:39 / 个人分类:mongodb
最近trunk.ly的工程师通过mongostat发现了大量的page fault,然后通过检查发现,他们的索引已经超出内存限制了(没有keep all index in RAM)。于是他们决定开始减小索引大小,通过测试得出了如下的数据,不同的数据类型的索引大小有2到3掊的差距。51Testing软件测试网
f9W9M-I\H R9KB*O
虽然能够想像得到,但是直观的数据图可能让我们更深刻的认识到。他们的测试再一次告诉我们:给索引定一个好的数据结构是多么重要。51Testing软件测试网${~\3p(mn2n/| x
这是测试结果图,分别是用int、MongoDB的ObjectID、base64和md5的字符串做索引产生的索引大小:
m$L&y{)P051Testing软件测试网:{6D-UOQxyb(j
F
测试过程也非常简单,首先用下面脚本将各种不同数据结构的数据写入到不同的collection里:51Testing软件测试网"T }Fr M(|f]
#!/usr/bin/env python
T$yA$_$u4Q,N:d#g$e051Testing软件测试网%GHw4tnM
import pymongo
F3b7PHlg{|0import bson 51Testing软件测试网#YR xpyG
from pymongo import Connection 51Testing软件测试网f:K^q:ot
51Testing软件测试网,^!U"b'u.E|3Z
db = connection.test_database 51Testing软件测试网BMb4r.]L
51Testing软件测试网f1z!{^ _+L
print('ObjectID') 51Testing软件测试网|]F K6De+TP)Ml
for i in range(1, 1000000):
g#u$T)K&L4EO0 db.objectids.insert({'i': i}) 51Testing软件测试网r["af6Q lul
51Testing软件测试网"pW6\%?R R$c7Os
print('int')
Q"R1N^"Z fu)N8^/p0for i in range(1, 1000000): 51Testing软件测试网wl/T%y;Fj
db.ints.insert({'_id': i, 'i': i})
F jVD&Xgu0
x)NG/g(}3x(V0print('Base64 BSON')
s&@}*[/w0for i in range(1, 1000000):
|*B K!?Znh0 db.base64s.insert({'_id': \ 51Testing软件测试网Q{]6O`Wz?Y
bson.Binary(hashlib.md5(str(i)).digest(), 51Testing软件测试网$UZ,MH9x]8j
bson.binary.MD5_SUBTYPE), 'i': i}) 51Testing软件测试网PxJ"ovS7Q)H
3o8f,j+jQFm0print('string')
6wa5[1F8fb0for i in range(1, 1000000):
G:@'PVj-NS.o0 db.strings.insert({'_id': hashlib.md5(str(i)).digest(), 'i': i})
d@iY&U*}eO3O'G0然后获取每个collection的index大小,得到如下的结果,画成上面的图:51Testing软件测试网{(mz HejCj!U
> db.base64s.stats() 51Testing软件测试网7W*Q^9D*k-q-}-kW
{ 51Testing软件测试网C_!B^#ihF
"totalIndexSize" : 67076096,
+i-Cd6N0D iQ`8~NK#C0}
?o.nf:B0w6l"Z;\0> db.objectids.stats()
0n*k0D)d/\JL0{
B[j|[4mRbs0 "totalIndexSize" : 41598976,
1aQ.T7I_ Y'e0}
j(r8P7Us)cnO c0> db.ints.stats()
N f6S)p5r0{ 51Testing软件测试网-L)B)q lJ `(X5T5?
"totalIndexSize" : 32522240, 51Testing软件测试网6fAa C;x[:ir@
} 51Testing软件测试网tR#^*vf:Y(W?
> db.strings.stats()
虽然能够想像得到,但是直观的数据图可能让我们更深刻的认识到。他们的测试再一次告诉我们:给索引定一个好的数据结构是多么重要。51Testing软件测试网${~\3p(mn2n/| x
这是测试结果图,分别是用int、MongoDB
m$L&y{)P0
测试过程也非常简单,首先用下面脚本将各种不同数据结构的数据写入到不同的collection里:51Testing软件测试网"T }Fr M(|f]
#!/usr/bin/env python
T$yA$_$u4Q,N:d#g$e051Testing软件测试网%GHw4tnM
import pymongo
F3b7PHlg{|0import bson 51Testing软件测试网#YR xpyG
from pymongo import Connection 51Testing软件测试网f:K^q:ot
51Testing软件测试网,^!U"b'u.E|3Z
db = connection.test_database 51Testing软件测试网BMb4r.]L
51Testing软件测试网f1z!{^ _+L
print('ObjectID') 51Testing软件测试网|]F K6De+TP)Ml
for i in range(1, 1000000):
g#u$T)K&L4EO0 db.objectids.insert({'i': i}) 51Testing软件测试网r["af6Q lul
51Testing软件测试网"pW6\%?R R$c7Os
print('int')
Q"R1N^"Z fu)N8^/p0for i in range(1, 1000000): 51Testing软件测试网wl/T%y;Fj
db.ints.insert({'_id': i, 'i': i})
F jVD&Xgu0
x)NG/g(}3x(V0print('Base64 BSON')
s&@}*[/w0for i in range(1, 1000000):
|*B K!?Znh0 db.base64s.insert({'_id': \ 51Testing软件测试网Q{]6O`Wz?Y
bson.Binary(hashlib.md5(str(i)).digest(), 51Testing软件测试网$UZ,MH9x]8j
bson.binary.MD5_SUBTYPE), 'i': i}) 51Testing软件测试网PxJ"ovS7Q)H
3o8f,j+jQFm0print('string')
6wa5[1F8fb0for i in range(1, 1000000):
G:@'PVj-NS.o0 db.strings.insert({'_id': hashlib.md5(str(i)).digest(), 'i': i})
d@iY&U*}eO3O'G0然后获取每个collection的index大小,得到如下的结果,画成上面的图:51Testing软件测试网{(mz HejCj!U
> db.base64s.stats() 51Testing软件测试网7W*Q^9D*k-q-}-kW
{ 51Testing软件测试网C_!B^#ihF
"totalIndexSize" : 67076096,
+i-Cd6N0D iQ`8~NK#C0}
?o.nf:B0w6l"Z;\0> db.objectids.stats()
0n*k0D)d/\JL0{
B[j|[4mRbs0 "totalIndexSize" : 41598976,
1aQ.T7I_ Y'e0}
j(r8P7Us)cnO c0> db.ints.stats()
N f6S)p5r0{ 51Testing软件测试网-L)B)q lJ `(X5T5?
"totalIndexSize" : 32522240, 51Testing软件测试网6fAa C;x[:ir@
} 51Testing软件测试网tR#^*vf:Y(W?
> db.strings.stats()