第1关:MongoDB 查询优化原则
任务描述
本关任务:了解查询优化原则,完成本关选择题。
相关知识
查询优化原则
-
在查询条件、排序条件、统计条件的字段上选择创建索引,可以显著提高查询效率;
-
用 $or 时把匹配最多结果的条件放在最前面,用 $and 时把匹配最少结果的条件放在最前面;
-
使用 limit() 限定返回结果集的大小,减少数据库服务器的资源消耗,以及网络传输的数据量;
-
尽量少用 $in,而是分解成一个一个的单一查询。尤其是在分片上,$in 会让你的查询去每一个分片上查一次,如果实在要用的话,先在每个分片上建索引;
-
尽量不用模糊匹配查询,用其它精确匹配查询代替,比如 $i 、$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 设计的理念之一。
答案
1.CD、2.AD、3.AC、4.ABD、5.BCD、6.ABCD、7.CD、8.AD
第2关:MongoDB 的 Profiling 工具(一)
任务描述
本关任务:完成慢查询设置。
编程要求
根据提示,在右命令行进行操作,在 mydb 数据库中开启 Profiling,设置级别为1,时间为50ms。
代码
mongo
use mydb
db.setProfilingLevel(1,50)
第3关:MongoDB 的 Profiling 工具(二)
任务描述
本关任务:完成慢查询设置并自行分析慢查询结果。
编程要求
在右侧命令行中,进行以下操作:
-
使用 MongoDB 的 mydb3 数据库;
-
开启并设置其慢查询日志功能,设置为模式1,时间限制为 5ms;
-
循环插入10万条数据到集合 items1 中,格式如下:
{_id:i,text:"Hello MongoDB"+i}
(插入方法不记得的同学,可参考 游标 这一节内容)
- 循环插入10万条数据到集合 items2 中,格式如下:
{_id:i,text:"Hello MongoDB"+i}
以上操作计入测评,请同学们进行完以上操作后对以下几条命令进行练习(不计入测评):
-
查看最新的 Profile 记录;
-
显示最近的慢查询事件;
-
特定时间(你自己操作时间段内),按照消耗时间排序的慢查询;
-
返回大于7毫秒慢的操作;
-
返回 items1 集合的慢查询。
代码
mongo
use mydb3
db.setProfilingLevel(1,5)
for(var i=0;i<100000;i++)db.items1.insert({_id:i,text:"Hello MongoDB"+i})
for(var i=0;i<100000;i++)db.items2.insert({_id:i,text:"Hello MongoDB"+i})