--- title: 3.3、索引构建情况分析 date: 2018-1-4 19:16:06 tags: - 数据库 - MongoDB - 索引 categories: - MongoDB --- 索引本身可以提高查询的效率 但是数据库要维护索引 , 需要额外的磁盘空间占用 , 并且写入的性能也会下降 要评判数据库当中的索引构建情况 常用的有下列4种方式 1. mongostat工具 2. profile集合 3. mongoDB自身的日志 4. explain分析 #### mongostat 这是mongoDB自带的一个工具 , 可以查看mongoDB的运行状态 > 在mongoDB的安装目录\bin当中 , 有一个名为mongostat.exe的程序 , 将bin路径加入到环境变量之后 , 就可以直接在控制台运行该程序 使用方式 `mongostat -h :<端口号>` 例如 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()** 这个函数会返回这次查询的相关信息用于分析