blog-web/source/_posts/MongoDB/3.3、索引构建情况分析.md
结发受长生 10e4564c71 时间调整
2018-05-20 19:39:08 +08:00

3.9 KiB
Raw Blame History

title date tags categories
3.3、索引构建情况分析 2018-1-4 19:16:06
数据库
MongoDB
索引
MongoDB

索引本身可以提高查询的效率 但是数据库要维护索引 , 需要额外的磁盘空间占用 , 并且写入的性能也会下降

要评判数据库当中的索引构建情况 常用的有下列4种方式

  1. mongostat工具
  2. profile集合
  3. mongoDB自身的日志
  4. explain分析

mongostat

这是mongoDB自带的一个工具 , 可以查看mongoDB的运行状态

在mongoDB的安装目录\bin当中 , 有一个名为mongostat.exe的程序 , 将bin路径加入到环境变量之后 , 就可以直接在控制台运行该程序

使用方式 mongostat -h <IP地址>:<端口号> 例如 mongostat -h 127.0.0.1:27017

这是一个针对mongoDB的综合监控程序 每秒根据各项指标进行采样 其中常用的各项指标的含义 ( 均是以每秒为单位 )

  • inserts - 写入数据的次数
  • query - 查询数据的次数
  • update - 更新数据的次数
  • delete - 删除数据的次数
  • getmore - 当查询的数据量较大时 , 为了防止内存溢出 , 并不会一次返回所有的数据 , 而是分批返回 , 获取下一批的数据执行的是getmore
  • command - 执行命令的数量
  • flushed - 将内存中的数据写入到硬盘的次数
  • vsize - 虚拟内存使用量单位MB
  • res - 物理内存使用量单位MB
  • faults/s - 访问失败数只有Linux有数据被交换出物理内存放到swap。不要超过100否则就是机器内存太小造成频繁swap写入。此时要升级内存或者扩展
  • ids miss - 查询没有命中索引的比例 ( 如果太高的话可能是创建了不合理的索引或者索引的数量不够 , 是一个潜在隐患 , 数据量过大就可能出现性能问题 )
  • qr | qw - 读队列/写队列 , 如果值较高的话就代表读写的负载比较高 , 可能出现性能问题
  • ar | aw - 当前活跃的客户端的数量
  • conn - 连接数量

profile集合

在mongoDB当中存在一个记录读写操作日志的集合 使用db.getProfilingLevel()可以获得当前的记录级别

  • 0 关闭 , 不做任何记录
  • 1 开启 , 有慢查询的时候记录
  • 2 开启 , 记录所有内容

默认是0 , 可以使用db.setProfilingLevel(1)开启慢查询的记录 从而通过分析这个集合当中的数据 有针对性的通过创建所以解决慢查询的问题

也可以在配置文件中配置profile=1来进行默认开启 slowms参数表示慢查询的毫秒数 , 查询所用的时间超过这个值的就是慢查询 , 默认是100

由于向profile当中写入数据本身也是占用性能的 , 尤其是这个集合当中内容较多的情况下 所以这种方式的应用场景通常是在开发和测试阶段

mongoDB的日志

在1.1的mongoDB安装配置步骤当中 , 第三步是创建windows服务以方便使用 并且配置了数据库所在路径和日志所在路径 这个服务实际是执行了mongod命令来启动数据库 并且传递了dbpath和logpath两个参数用来指定数据的存储位置和日志的写入路径

我们也可以在本地创建一个配置文件( 通常是conf格式 )来配置这些参数 , 从而方便进行配置的修改 mongod --config "配置文件路径" --install --serviceName "MongoDB" 配置文件内容的写法与.properties文件相同 其中常用的配置项有

  • dbpath - 数据目录
  • port - 服务器监听的端口 , 默认是27017
  • fork - (true/false) 是否以守护进程方式运行
  • logpath - 日志输出路径
  • verbose - (v~vvvvv) 日志信息冗余级别 , v越多详细度越高
  • bind_ip - 绑定的IP地址 , 绑定以后只能通过该IP与数据库连接 ( 多个IP用逗号分隔 )
  • maxConns - 最大连接数

explain分析

用法 : 在find函数的返回结果上调用explain() 这个函数会返回这次查询的相关信息用于分析