持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情
如果想查看创建的索引是否被有效执行,该怎么解决呢?
这里 MongoDB 查询分析可以帮助我们查询所建立的索引是否有效。除此之外,它还是查询语句性能分析的重要工具。本实验我们将主要给大家介绍衡量索引使用的几种方式:
- 使用
$indexStats度量索引使用 - 使用
explain()返回查询计划 - 使用
hint()控制索引使用
使用 $indexStats 衡量索引使用
$indexStats 返回有关集合中每个索引的使用情况的统计信息。如果使用访问控制运行,则用户必须要具有包括 indexStats 操作在内的权限。下面我们就一起来看看 $indexStats 如何使用。
当使用 $indexStats 统计每个索引的信息时,返回文档中包括以下字段:
| 返回字段 | 说明 |
|---|---|
| name | 索引名称。 |
| key | 索引键的规范。 |
| host | mongod 的主机名和端口。 |
| accesses | 索引使用的统计:ops 是使用索引的操作数;since 是 MongoDB 收集统计信息的时间。 |
| shard | 与主机关联的分片的名称,仅适用于分片集群(版本 4.2.4 中新功能)。 |
| spec | 索引的完整规范文档,其中包括索引键规范文档(版本 4.2.4 中新功能)。 |
| building | 指示当前是否正在构建索引(版本 4.2.4 中新功能)。 |
演示使用 $indexStats 查询索引使用的统计信息。
-
给
course集合创建以下两个索引db.course.createIndex({name:1,quantity:1}) db.course.createIndex({name:1,author:1}) -
使用下面命令查询集合中的数据
db.course.find({author:"zhangwuji"}) db.course.find({quantity:{$gt:10}}).sort({quantity:1}) -
使用
$indexStats结合聚合操作查询索引使用的统计信息查询操作:
db.course.aggregate([{$indexStats:{}}]).pretty()✨ 说明:
{ $indexStats: { } }是一个固定语法,返回所有索引使用的统计信息。
使用 explain() 返回查询计划
explain 操作提供了查询信息、使用索引及查询统计等操作,这有利于我们针对索引进行相应的优化。接下来我们简单的来看一下执行 explain 操作或返回了哪些信息。
-
在前面创建好的索引下,执行下面查询操作并使用
explain()方法:db.course.find({author:"yangguo"}).explain()✨ 说明:可以通过
explain()方法查询一个查询的执行计划,来判断如何添加或者优化索引
在 3.0 版本之后, explain() 方法里可以有三个参数:queryPlanner、executionStats、allPlansExecution,默认情况下是 queryPlanner,如上所示。关于这个三参数的详细介绍,大家可以参考官方文档。
下面我们对默认情况下返回的结果进行简单分析:
-
queryPlanner.namespace:一个字符串,指定运行查询的命名空间,即集合。 -
queryPlanner.indexFilterSe:一个 boolean 值,表示 MongoDB 对此 query shape 是否使用了索引过滤器。 -
queryPlanner.winningPlan:文档类型,详细显示查询优化程序选择的查询计划。winningPlan.stage: 阶段名称,每个阶段都有每个阶段特有的信息。 这里的COLLSCAN表示进行集合扫描;IXSCAN表示索引扫描。
-
queryPlanner.rejectedPlans:查询优化器考虑和拒绝的候选计划数组。 如果没有其他候选计划,则该数组可以为空。
使用 hint() 控制索引使用
MongoDB 中的查询优化器使用起来很不错,但是 MongoDB 也可以使用 hint 来强制使用一个指定的索引。在某些情况下,这个方法会提升性能。
- 在前面创建好的索引下,指定使用
name索引字段执行下面查询操作并使用explain()方法分析查询操作:
db.course.find({author:"zhangsan"}).hint({$natural:1}).explain()
✨ 说明:在
hint()方法中声明$natural参数,避免 MongoDB 在查询过程中使用任何索引。