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

最近trunk.ly的工程师通过mongostat发现了大量的page fault,然后通过检查发现,他们的索引已经超出内存限制了(没有keep all index in RAM)。于是他们决定开始减小索引大小,通过测试得出了如下的数据,不同的数据类型的索引大小有2到3倍的差距。

虽然能够想像得到,但是直观的数据图可能让我们更深刻的认识到。他们的测试再一次告诉我们:给索引定一个好的数据结构是多么重要。

这是测试结果图,分别是用int、MongoDB的ObjectID、base64和md5的字符串做索引产生的索引大小:

未命名.jpg


测试过程也非常简单,首先用下面脚本将各种不同数据结构的数据写入到不同的collection里:

#!/usr/bin/env python

import pymongo

import bson

from pymongo import Connection

db = connection.test_database

print('ObjectID')

for i in range(1, 1000000):

db.objectids.insert({'i': i})

print('int')

for i in range(1, 1000000):

db.ints.insert({'_id': i, 'i': i})

print('Base64 BSON')

for i in range(1, 1000000):

db.base64s.insert({'_id': \

bson.Binary(hashlib.md5(str(i)).digest(),

bson.binary.MD5_SUBTYPE), 'i': i})

print('string')

for i in range(1, 1000000):

db.strings.insert({'_id': hashlib.md5(str(i)).digest(), 'i': i})

然后获取每个collection的index大小,得到如下的结果,画成上面的图:

> db.base64s.stats()

{

"totalIndexSize" : 67076096,

}

> db.objectids.stats()

{

"totalIndexSize" : 41598976,

}

> db.ints.stats()

{

"totalIndexSize" : 32522240,

}

> db.strings.stats()

{

"totalIndexSize" : 90914816,

}

原文链接:How to save 200% RAM by selecting the right key data typefor #MongoDB

你可能感兴趣的:(mongodb)