Select 只获取必要的字段

why:

select *会增加cpu/io/内存/带宽的消耗

指定字段能有效利用索引覆盖:find({id: “test”}).select({id: 1}) 命中索引id, 因只select了id, 所以mongo直接返回了id, 不会再索引到具体的document,效率大大提高。

避免过度使用嵌入文档,最多只能一层, 不使用数组嵌套

why:

document有16MB限制。

尽量避免使用负向查询以及%开头的模糊查询

why:

ne、nin %开头 无法有效使用索引

禁止使用look up

why:

分片后,look up操作失效

不在数据库中进行数据计算

why:

js精度问题 (0.1 + 0.2 = 0.30000000000000004__)

cpu计算导致数据库卡顿,解放数据库CPU,把复杂逻辑计算放到服务层。

平衡范式与冗余

为提高效率,可以冗余数据

拒绝大sql,大批量 操作

禁止在更新十分频繁、区分度不高的属性上建立索引

why:

更新会变更B+树,更新频繁的字段建立索引会大大降低数据库性能

“性别”这种区分度不大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似

索引内存也是有限的

使用explain 优化查询

查看explain结果,

可以简单查看inputStages.stage判断查询效率。

COLLECTION:全表查询

IXSCAN:命中索引查询

禁止使用自带全文索引

why:

效率低

MongoDb_Demo

参考: mysql 50条军规