6-1MongoDB 实验——数据库优化--edu上面的nosql题目
目录第1关:MongoDB 查询优化原则第2关:MongoDB 的 Profiling 工具(一)第3关:MongoDB 的 Profiling 工具(二)第1关:MongoDB 查询优化原则查询优化原则在查询条件、排序条件、统计条件的字段上选择创建索引,可以显著提高查询效率;用 $or 时把匹配最多结果的条件放在最前面,用 $and 时把匹配最少结果的条件放在最前面;使用 limit() 限定返
目录
第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 设计的理念之一。
第2关:MongoDB 的 Profiling 工具(一)
Profiling 工具
在很多情况下, DBA(数据库管理员)都要对数据库的性能进行分析处理,找出降低性能的根源。而 Profiling 就是 Mongo 自带的一种分析工具来检测并追踪影响性能的慢查询。
慢查询日志一般作为优化步骤里的第一步。通过慢查询日志,定位每一条语句的查询时间。比如超过了50ms,那么查询超过50ms 的语句需要优化。然后它通过 .explain() 解析影响行数是不是过多,所以导致查询语句超过50ms。
优化步骤一般就是:
- 用慢查询日志(system.profile)找到超过50ms 的语句;
- 然后再通过 .explain() 解析影响行数,分析为什么超过50ms;
- 决定是不是需要添加索引。
Profiling 级别说明:
- 0:关闭,不收集任何数据;
- 1:收集慢查询数据,默认是100毫秒;
- 2:收集所有数据。
启用 Profiling 工具
Profiling 有两种开启方式,一种是启动服务时配置启动,一种是 mongoshell 中进行实时配置。
1、mongo shell 中启动配置
- 查看状态: db.getProfilingfStatus()
- 查看级别: db.getProfilingfStatus()
- 设置级别:db.setProfilingfStatus(1) #括号里的就是要设置的级别
- 设置级别和时间:db.setProfilingfStatus(1,50)
注意:
- 以上要操作要是在 test 集合下面的话,只对该集合里的操作有效,要是需要对整个实例有效,则需要在所有的集合下设置或则在开启的时候开启参数;
- 每次设置之后返回给你的结果是修改之前的状态(包括级别、时间参数)。
2、全局开启 Profiling
- 可以在 mongod 启动时加上以下参数:
mongod --profile=1 --slowms=50
• 或在配置文件里添加两行,如下所示:
1. profile = 1
2. slowms = 50
关闭 Profiling 工具
只需要将收集慢查询数据的时间设置为0就可以关闭: db.setProfilingfStatus(0)
第3关:MongoDB 的 Profiling 工具(二)
慢查询分析
要进行慢查询分析,首先,要如第二关一样启用 Profiling 工具,以下例子 Profiling 级别设置为1,时间设置为50ms。其次,要进行过超过 50ms 的操作才会记录到慢查询日志中,存在记录结果。
首先,在 test 数据库启用 Profiling 工具:
use test
db.setProfilingLevel(1,50)
# 设置级别为1,时间为50ms,意味着只有超过50ms的操作才会记录到慢查询日志中
然后在 test 数据库的 items 集合中循环插入10万条数据:
for(var i=0;i<100000;i++)db.items.insert({_id:i,text:"Hello MongoDB"+i})
返回所有结果:
- db.system.profile.find().pretty()
返回最近的10条记录:
- db.system.profile.find().limit(10).sort({ ts : -1 }).pretty()
返回所有的操作,除 command 类型的:
- db.system.profile.find( { op: { $ne : 'command'} }).pretty()
返回特定集合:
- db.system.profile.find( { ns : 'test.items' } ).pretty()
返回大于5毫秒慢的操作:
- db.system.profile.find({ millis : { $gt : 5 } } ).pretty()
从一个特定的时间范围内返回信息:
- db.system.profile.find(
- {
- ts : {
- "$gt" : new ISODate("2021-10-25T10:30:00Z"),
- "$lt" : new ISODate("2021-10-25T11:10:00Z")
- }
- }
- ).pretty()
- db.system.profile.find(
- {
- ts : {
- $gt : new ISODate("2021-10-25T10:30:00Z"),
- $lt : new ISODate("2021-10-25T11:10:00Z")
- }
- }
- ).pretty()
查看最新的 Profile 记录:
- db.system.profile.find().sort({$natural:-1}).limit(1).pretty()
显示5个最近的事件:
- show profile
编程测试代码:
mongo
use mydb3
db.setProfilingLevel(1,5)
for(i=0;i<100000;i++){db.items1.insert({_id:i,text:"Hello MongoDB"+i})}
for(i=0;i<100000;i++){db.items2.insert({_id:i,text:"Hello MongoDB"+i})}
更多推荐
所有评论(0)