MongoDb Base Rule
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:
效率低
参考: mysql 50条军规
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JIE's Blos!