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