作者:陈贺
邮箱:hee0624@163.com
一. 文档规约
- 【强制】库名、集合名和字段名必须使用小写字母或数字或下划线,禁止出现数字和下划线开头。数据库字段名修改代价很大,所以字段名称需要慎重考虑。
- 【强制】库名和集合名不使用复数名词。
说明:集合名应该仅仅表示集合里面的文档内容,不应该表示数量。
- 【强制】禁用保留字,如
update,find,find_one,set,push,sort
等,请参考MongoDB官方保留字。 - 【强制】表达是与否概念的字段,必须使用is_xxx的方式命名。
- 【强制】文档中必备三个字段:_id, create_time,uptime_time。其中_id为主键,自动创建,禁止向_id中写入自定义内容。
说明:id是MongoDB中的默认主键,一旦_id的值为非自增,当数据量达到一定程度之后,每一次写入都可能导致主键的二叉树大幅度调整,这将是一个代价极大的写入, 所以写入就会随着数据量的增大而下降,所以一定不要在_id中写入自定义的内容。 - 【推荐】文档名的命名最好遵循“业务名称_文档的作用”
二. 索引规约
- 【强制】MongoDB 的组合索引使用策略与 MySQL 一致,遵循“最左原则”。
说明:A、B、C组合索引覆盖了(A)、(A,B)、(A,B,C)三个索引。 - 【强制】唯一索引名为uk_字段名;普通索引名为idx_字段名;联合索引名为un_字段名缩写_字段名缩写。索引名称长度不要超过128字符;
说明:-- 创建索引的完整方法
db.collection.createIndex(keys , options) options: backgroud <boolean>;unique <boolean>;name <string>
。 - 【强制】单个集合索引个数不能超过64个。
说明:索引加速查询性能,但会降低写入操作,每个index都应该被查询使用,定期检查无用索引。 - 【强制】创建索引要在后台创建,避免阻塞业务和查询。
- 【推荐】 创建索引建议:先做等值查询,在做排序,在做范围查询。
三. 语句规约
- 【强制】查询中的某些
$
操作符可能会导致性能低下,如$ne
,$not
,$exists
,$nin
,$or
,尽量在业务中不要使用。
说明:$exist
:因为松散的文档结构导致查询必须遍历每一个文档;$ne
:如果当取 反的值为大多数,则会扫描整个索引;**$not
:**可能会导致查询优化器不知道应当使用 哪个索引,所以会经常退化为全表扫描; **$nin
:**全表扫描; **$or
:**有多少个条件 就会查询多少次,最后合并结果集,所以尽可能的使用$in
- 【强制】查询结果,按需
project
字段。不要返回所有结果。 - 【推荐】如果需要清理掉一个集合中的所有数据,那么
remove()
的性能是非常低下的,该场景下应当使用drop()
。 - 【推荐】避免使用skip略过大量的结果。
说明:当数据量大时候,寻找不适用skip的情况 下使用分页。
正例:
var page1 = db.foo.find().sort({"date":-1}).limit(100)
然后利用最后一个文档中“date”的值作为查询条件,获取下一页;
var page2 = db.foo.find({"date": {"$gt": latest.date}});
page2 = page2.sort({"date": -1}).limit(100);
反例:
var page1 = db.foo.find(criteria).limit(100);
var page2 = db.foo.find(criteria).skip(100).limit(100);