十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

MongoDB 索引数据类型优化,节省60%内存

上一篇 / 下一篇  2011-06-18 10:21:39 / 个人分类:mongodb

最近trunk.ly的工程师通过mongostat发现了大量的page fault,然后通过检查发现,他们的索引已经超出内存限制了(没有keep all index in RAM)。于是他们决定开始减小索引大小,通过测试得出了如下的数据,不同的数据类型的索引大小有2到3掊的差距。51Testing软件测试网 f9W9M-I\HR9KB*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软件测试网%GHw4t nM
import pymongo 
F3b7PHlg{|0import bson 51Testing软件测试网#Y R 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}) 
FjVD&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"o vS7Q)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软件测试网{(mzHejCj!U
> db.base64s.stats() 51Testing软件测试网7W*Q ^9D*k-q-}-kW
51Testing软件测试网C_!B^#ihF
        "totalIndexSize" : 67076096, 
+i-Cd6N0DiQ`8~NK#C0
?o.nf:B0w6l"Z;\0> db.objectids.stats() 
0n*k0D)d/\J L0
B[j|[4mRbs0        "totalIndexSize" : 41598976, 
1aQ.T7I_ Y'e0
j(r8P7U s)cnOc0> db.ints.stats() 
Nf6S)p5r051Testing软件测试网-L)B)q lJ `(X5T5?
        "totalIndexSize" : 32522240, 51Testing软件测试网6fAaC;x[:ir@
51Testing软件测试网tR#^*vf:Y(W?
> db.strings.stats() 
Tc*Ud0{0
p4} p*Q)?#Y0        "totalIndexSize" : 90914816, 
M,r GWTY0
x0F ux7{+sZ+oO3t2F!d0}原文链接:How to save 200% RAM by selecting the right key data type for #MongoDB

TAG: MongoDB mongodb mongoDB

 

评分:0

我来说两句

Open Toolbar