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

索引本身可以提高查询的效率
但是数据库要维护索引 , 需要额外的磁盘空间占用 , 并且写入的性能也会下降
<!-- more -->
要评判数据库当中的索引构建情况
常用的有下列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()**
这个函数会返回这次查询的相关信息用于分析

