mongodb优化技巧

不要嵌入不断增加的数据

对数组不断追加数据是很低效的,正常使用中数组和对象大小应该相对固定

预填充数据

对于格式固定的数据,可以预先创建,插入模板数据,后边用的时候只需要更新操作就行,不需要分配空间

文档自给自足

mongodb是一种“无脑”的大型数据存储(它几乎不做任何数据处理,仅仅存取数据)
避免让mongodb做一些能在客户端完成的任务(甚至是求平均值或是求和)
使用频繁的数据最好能直接从文档中获得而不是每次经文档计算

少使用where

使用where:将集合每一个文档转化为js对象-》解析文档中的BSON并添加他们所有字段到js对象中-》执行JS-》销毁对象

使用正确的类型

不要将ObjectID存为字符串
PS.大多数驱动可以从OID获取创建日期

关于_id

当使用自己的id替换时,随机插入的值会导致在整个索引树上进行插入,而OID的值总是增加,插入时只需要将B树的右侧调入内存处理就行

不要使用数据库引用

存储的只是普通子文档,还不是要自己查

使用索引减少内存占用

mongodb没索引查询过程:将文档第一页调入内存-》比较完全部数据后掉下一页-》直到遍历整个集合
索引原理:对x建索引,会创建树,树中每个索引都带有x的值和一个指向对应文档的指针。查询时只需要搜索索引即可,小于向左,大于向右
PS.不要到处使用索引

索引覆盖查询

question:只需要返回某些字段且这些字段都可放在索引中。answer:索引覆盖查询,这种查询不会访问指针指向的文档,而是直接用索引的数据返回结果

db.foo.ensureIndex({x:1,y:1,z:1})
现在,
db.foo.find({x:XXX,y:XXX},{x:1,y:1,z:1,_id:0})

分级文档加速扫描

不要使用扁平结构,这样必须遍历每个文档的每个字段,如

{
    is:XX,
    name:XXX,
    email:XXX,
    phone:XXXX
}

优化一下就相当于建立了自己的“树”

AND和OR型查询要点

AND:将更苛刻的条件放在最前面
OR:将更宽松的条件放在最前面

posted @ 2016-06-23 20:19  jcuan  阅读(188)  评论(0编辑  收藏  举报