查询分析介绍

152 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

如果想查看创建的索引是否被有效执行,该怎么解决呢?

这里 MongoDB 查询分析可以帮助我们查询所建立的索引是否有效。除此之外,它还是查询语句性能分析的重要工具。本实验我们将主要给大家介绍衡量索引使用的几种方式:

  • 使用 $indexStats 度量索引使用
  • 使用 explain() 返回查询计划
  • 使用 hint() 控制索引使用

使用 $indexStats 衡量索引使用

$indexStats 返回有关集合中每个索引的使用情况的统计信息。如果使用访问控制运行,则用户必须要具有包括 indexStats 操作在内的权限。下面我们就一起来看看 $indexStats 如何使用。

当使用 $indexStats 统计每个索引的信息时,返回文档中包括以下字段:

返回字段说明
name索引名称。
key索引键的规范。
hostmongod 的主机名和端口。
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() 方法里可以有三个参数:queryPlannerexecutionStatsallPlansExecution,默认情况下是 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 在查询过程中使用任何索引。