##############
关于索引
-
原则上对于所有的查询都需要有对应的索引,对于上万条记录的collection,是一定需要对应的索引;
-
索引长度限制1024字节(index key limit), 避免对大字符串字段创建索引和作为查询条件(MongoDB4.2有改动)
-
注意组合索引创建的字段顺序
- MongoDB组索引的字段顺利很重要,如最左原则,等值在前,范围查询在后, order by等在后
-
尽量使用覆盖索引(Covered Indexes),只通过索引扫描就可以得到需要的数据,避免读取数据文件
-
使用Projection来减少返回到客户端的文档内容,减少内存、网络带宽的浪费
- MongoDB类似MySQL一样可以指定select返回的字段,避免使用select *的方式返回所有字段内容;
游标的使用
-
一个游标已经遍历完,则会自动关闭,如果没有遍历完,则需要手动调用close()方法
-
游标默认在服务器上存在10分钟后释放,如果不主动调用close(),会造成不必要的资源浪费
-
如果不能遍历完一个游标,通常意味着查询条件太宽泛,更应该考虑的问题是如何将条件收紧
处理分页问题 - 避免使用count
-
尽可能不要计算总页数,特别是数据量大和查询条件不能完全命中索引时
-
建议只遍历前50条数据,比如: db.coll.find({x:100}).limit(50);
-
为了计算总页数而进行的count()往往是拖慢页面整体加载速度的原因
-
处理分页问题 - 巧分页
-
避免使用skip/limit形式的分页,特别是数据量大的时候
-
替代方案:使用查询条件+唯一排序条件
例如:
第一页: db.posts.find({}).sort({_id:1}).limit(20);
第二页: db.posts.find({_id:{$gt< 第一页最后一个_id}}).sort({_id:1}).limit(20)
第三页: db.posts.find({_id:{$gt< 第二页最后一个_id}}).sort({_id:1}).limit(20)
#######################