了解 MongoDB 日志中的 IXSCAN 和 COLLSCAN

Ant*_*och 7 database-administration database-performance mongodb

我正在尝试通过一些 Mongo 日志进行 grep 以尝试找到我需要优化的缓慢操作。慢查询日志记录是默认的,记录操作超过 100 毫秒。

我认为可以肯定地说,一般来说,搜索 COLLSCANS 会显示需要注意的查询。不太清楚的是,如果 IXSCANS 是我应该搜索的细节。

考虑此处的 MongoDB 文档:

https://docs.mongodb.com/manual/reference/explain-results/#collection-scan-vs-index-use

我的理解是这是一种二元情况,查询是 COLLSCAN 或 IXSCAN。因此,如果我对 IXSCAN 进行 grep,我将查看所有不是 COLLSCANS 的慢查询。这是真的?

Ste*_*nie 8

我正在尝试通过一些 Mongo 日志进行 grep 以尝试找到我需要优化的缓慢操作。慢查询日志记录是默认的,记录操作超过 100 毫秒。

我强烈建议使用开源mtools项目中的脚本,而不是通过 MongoDB 日志进行 grep 。注意:我不是mtools原作者,但我是贡献者。

mtools 是一组 Python 脚本,其灵感来自于通过搜索 GB 的日志来尝试查找生产 MongoDB 部署感兴趣的信息的痛苦。关键脚本旨在适应通过连续过滤器(例如mlogfilter --scan | mplotqueries)管道输出的典型命令行工作流程。

例如:

  • mloginfo --queries 是一个很好的起点:它聚合了查询模式,因此您可以专注于频繁运行且对您的部署具有更大整体影响的查询。
  • mlogfilter本质上是 MongoDB 日志的 grep:您可以按命名空间、持续时间、连接、模式和其他条件过滤日志行。该--scan选项有助于识别不一定是集合扫描的低效查询。
  • mplotqueries 是一个可视化日志的工具,它可以非常有助于识别模式和异常值。

我认为可以肯定地说,一般来说,搜索 COLLSCANS 会显示需要注意的查询。不太清楚的是,如果 IXSCANS 是我应该搜索的细节。

集合扫描通常很有趣,但也可能是一次性查询或预期使用小集合的结果。我不会关注查询类型,而是查看部署中的慢查询(或一般的慢操作),以更好地了解您可能能够改进的内容。使用索引通常是好的,但有一些低效的索引使用(例如内存中排序或不区分大小写的正则表达式)值得解决。

我的理解是这是一种二元情况,查询是 COLLSCAN 或 IXSCAN。因此,如果我对 IXSCAN 进行 grep,我将查看所有不是 COLLSCANS 的慢查询。这是真的?

如果您使用 grep,IXSCAN您将找到所有提到 的日志行IXSCAN,但慢查询日志结果绝对不是二进制的,并且也会因 MongoDB 服务器版本而异。虽然高效的索引使用是一种明显的优化,但有许多内部查询规划器阶段可能与了解查询性能有关。

当您在日志中发现有趣的慢查询时,下一步通常是查看更详细的explain output. 我使用explain(true)(又名allPlansExecution模式),因为这显示了被考虑的查询计划以及获胜计划的详细信息。如果您不确定如何解释慢查询的解释输出,我建议您在DBA StackExchange上发帖。

值得注意的是,解释查询并不是衡量工作负载的实际性能。在正常操作中,查询计划被缓存,而详细explain输出专门重新评估候选索引和查询计划。有关更多信息,请参阅MongoDB 手册中的查询计划