- 在查询条件、排序条件、统计条件的字段上选择创建索引,可以显著提高查询效率。
- 用$or时把匹配最多结果的条件放在最前面,用$and 时把匹配最 少 结果的条件放在最前面。
- 使用 limit()限定返回结果集的大小,减少数据库服务器的资源消耗,以及网络传输的数据量。
- 尽量少用$in,而是分解成一个一个的单一查询。尤其是在分片上,$in 会让你的查询去每一个分片上查一次,如果实在要用的话,先在每个分片上建索引。
- 尽量不用模糊匹配查询,用其它精确匹配查询代替,比如$in、$nin。
- 查询量大、并发大的情况,通过前端加缓存解决。
- 能不用安全模式的操作就不用安全模式,这样客户端没必要等待数据库返回查询结果以及处理异常,快了一个数量级。
- MongoDB 的智能查询优化,判断粒度为 query 条件,而 skip 和 limit 都不在其判断之中,当分页查询最后几页时,先用 order 反向排序。
- 尽量减少跨分片查询,balance 均衡次数少。
- 只查询要使用的字段,而不查询所有字段。
- 更新字段的值时,使用$inc 比 update 效率高。
- apped collections 比普通 collections 的读写效率高。
- server-side processing 类似于 SQL 查询的存储过程,可以减少网络通讯的开销。
- 必要时使用 hint()强制使用某个索引查询。
- 如果有自己的主键列,则使用自己的主键列作为 id,这样可以节约空间,也不需要创建额外的所以。
- 使用 explain,根据 exlpain plan 进行优化。
- 范围查询的时候尽量用$in、$nin 代替。
- 查看数据库查询日志,具体分析的效率低的操作。
- mongodb 有一个数据库优化工具 database profiler,能够检测数据库操作的性能。可以发现 query 或者 write 操作中执行效率低的,从而针对这些操作进行优化。
- 尽量把更多的操作放在客户端,当然这就是 mongodb 设计的理念之一。