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

88 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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()**
这个函数会返回这次查询的相关信息用于分析