首页 > 其他分享 >如何处理monogdb的慢查询

如何处理monogdb的慢查询

时间:2024-09-19 13:23:41浏览次数:1  
标签:处理 monogdb explain db collection 查询 executionStats Returns query

识别慢查询

有几种方法可以用来查看mongodb中的慢查询。

1.使用profiler

如何使用profiler,需要参考之前的笔记。

 

清空profiler内容:

 > use mydb;
 > db.system.profile.remove();

2.使用db.currentOp()

此方法是实时分析。

db.currentOp(true)
db.currentOp({ "active": true, "secs_running": { "$gt": 3 } });

找出当前执行超过多长时间的操作

db.currentOp({ "active" : true, "secs_running" : { "$gt" : 3 }})
    .pretty();

3.借助mongodb的日志文件

比如mongodb日志中,包含COMMAND关键字表示慢查询操作。

{"t":{"$date":"2023-08-29T20:57:33.035+08:00"},"s":"I",  "c":"COMMAND",  "id":51803,   "ctx":"conn47700","msg":"Slow query","attr":{"type":"command","ns":"abc.$cmd","command":{"delete":"testc","ordered":true,"lsid":{"id":{"$uuid":"d767da6b-7850-4d63
-9287-2dad6594a6c8"}},"$clusterTime":{"clusterTime":{"$timestamp":{"t":1693313850,"i":120}},"signature":{"hash":{"$binary":{"base64":"7uZW3j1eCUqrKUuhwTIUWva9ewQ=","subType":"0"}},"keyId":7217642581868412933}},"$db":"abc"},"numYields":10,"reslen":230,"lock
s":{"ParallelBatchWriterMode":{"acquireCount":{"r":11}},"FeatureCompatibilityVersion":{"acquireCount":{"r":2,"w":11}},"ReplicationStateTransition":{"acquireCount":{"w":12}},"Global":{"acquireCount":{"r":2,"w":11}},"Database":{"acquireCount":{"w":11}},"Coll
ection":{"acquireCount":{"w":11}},"Mutex":{"acquireCount":{"r":1}}},"flowControl":{"acquireCount":11,"timeAcquiringMicros":6},"readConcern":{"level":"local","provenance":"implicitDefault"},"writeConcern":{"w":"majority","wtimeout":0,"provenance":"implicitD
efault"},"storage":{},"remote":"192.168.1.30:42420","protocol":"op_msg","durationMillis":133}}

深入理解MongoDB的慢查询

mongodb提供了三种方法来提供explain帮助:

·db.collection.explain()方法

·cursor.explain()方法

·explain命令

 

每个命令有三种可能的Verbosity 模式:

(1)queryPlanner模式:mongodb会运行查询优化器,选出选中的计划,并返回执行计划的详细信息,但是不会真正的执行该执行计划

(2)executionStats模式:mongodb会运行查询优化器,选出选中的计划并执行,返回详细的统计信息

(3)allPlansExecution模式:mongodb会运行查询优化器,选出选中的计划并执行,返回详细的统计信息。还会返回可选的执行计划信息

如何使用explain方法,取决与用户的选择。例如,executionStats模式:

db.collection
    .explain("executionStats")
    .aggregate([
        { $match: { col1: "col1_val" }},
        { $group: { _id: "$id", total: { $sum: "$amount" } } },
        { $sort: { total: -1 } }
    ])


db.products.find({ category: "electronics", price: { $lt: 1000 } }).explain("executionStats");

 

无论是以哪种方式执行explain,都会包含以下章节内容:

(1)Query Planner(queryPlanner):查询优化器选择的执行计划

(2)Execution Statistics(executionStats):胜出的执行计划的实际执行信息,必须是实际执行了执行计划

(3)Server Information(serverInfo):mongodb实例信息

 

db.collection.explain()

db.collection.explain()是mongosh中使用的方法。该方法返回以下方法的查询计划:

·aggregate()
·count()
·find()
·remove()
·distinct()
·findAndModify()

使用的语法为:

db.collection.explain().<method(...)>

查看帮助:

> db.collection.explain().help()

  Explainable Class:

    getCollection                              Returns the explainable collection.
    getVerbosity                               Returns the explainable verbosity.
    setVerbosity                               Sets the explainable verbosity.
    find                                       Returns information on the query plan.
    aggregate                                  Provides information on the query plan for db.collection.aggregate() method.
    count                                      Returns information on the query plan for db.collection.count().
    distinct                                   Returns information on the query plan for db.collection.distinct().
    findAndModify                              Returns information on the query plan for db.collection.findAndModify().
    findOneAndDelete                           Returns information on the query plan for db.collection.findOneAndDelete().
    findOneAndReplace                          Returns information on the query plan for db.collection.findOneAndReplace().
    findOneAndUpdate                           Returns information on the query plan for db.collection.findOneAndUpdate().
    remove                                     Returns information on the query plan for db.collection.remove().
    update                                     Returns information on the query plan for db.collection.update().
    mapReduce                                  Returns information on the query plan for db.collection.mapReduce().

使用示例:

db.products.explain().remove( { category: "apparel" }, { justOne: true } )

db.products.explain( "allPlansExecution" ).findAndModify( {
   query: { name: "Tom", state: "active", rating: { $gt: 10 } },
   sort: { rating: 1 },
   update: { $inc: { score: 1 } }
} )

explain()的参数 verbose定义输出内容的详细级别,有三个级别:queryPlanner(默认级别)、executionStats、allPlansExecution

cursor.explain()

cursor.explain()也是mongosh 方法。

使用语法为:

db.collection.find().explain()

例如:

db.products.find(
   { quantity: { $gt: 50 }, category: "apparel" }
).explain("executionStats")

explain()的参数 verbose定义输出内容的详细级别,有三个级别:queryPlanner(默认级别)、executionStats、allPlansExecution

explain命令

使用语法:

db.runCommand(
   {
     explain: <command>,
     verbosity: <string>,
     comment: <any>
   }
)

使用示例:

db.runCommand(
   {
      explain: { count: "products", query: { quantity: { $gt: 50 } } },
      verbosity: "executionStats"
   }
)

理解执行计划

·collscan表示集合扫描

·ixscan表示索引键扫描

·fetch表示检索文档

·shard_merge表示从shards合并结果

·sharding_filter表示从shards中过滤掉孤儿文档(orphan documents)

 

比如,下面的执行计划:

"winningPlan" : {
    "stage" : "COUNT",
    ...
    "inputStage" : {
        "stage" : "COLLSCAN",
        ...
    }
}

表明在根节点聚合之前,执行了集合扫描。也表示没有合适的索引可用。

 

根据具有的查询,其他一些因素也值得深究:

·queryPlanner.rejectedPlans:被优化器拒绝掉的执行计划

·queryPlanner.indexFilterSet: 执行计划是否使用到了索引过滤集

·queryPlanner.optimizedPipeline;表示是否整个聚合管道操作被优化掉了

·executionStats.nReturned:匹配查询条件的文档数量

·executionStats.executionTimeMillis:选择和执行执行计划花费的时间

·executionStats.totalKeysExamined :扫描的索引条目数量

·executionStats.totalDocsExamined:检查的所有文档数量

标签:处理,monogdb,explain,db,collection,查询,executionStats,Returns,query
From: https://www.cnblogs.com/abclife/p/18420155

相关文章

  • 【微处理器系统原理与应用设计第十三讲】通用同/异步收发器USART轮询模式应用设计
    USART提供两设备之间的串行双工通信,并支持中断和DMA工作。采用轮询、中断和DMA三种方式进行数据收发。一、功能需求实现远程串行通信数据的回传确认。微处理器系统构成的测控设备通过USART(串口)与用户设备(上位机)相连。上位机每次发送一个字符后等待测控设备将收到的字符回传到......
  • Python 集合的魔法:解锁高效数据处理的秘密
    引言集合作为Python的一种内置数据类型,其本质是一个无序且不重复的元素序列。虽然表面上看它似乎只是列表或元组的一种变体,但实际上,集合背后有着更为高效的查找机制。通过学习和掌握集合的高级操作,我们不仅能更好地理解Python内部的工作原理,还能在实际开发中解决许多棘手的问......
  • ES 高亮查询及基本配置
    依赖<!--es--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></dependency>配置必加//es://hostname:124.70.138.156//port:92......
  • 深入理解 dladdr:符号信息查询与应用场景详解
    dladdr是一个用于获取与特定地址相关的符号信息的函数,它在Linux和类UNIX系统中非常有用,尤其是在进行调试或诊断时。以下是详细的介绍和一些使用示例:1.基本概念dladdr函数通常用于获取共享库中的符号信息。它可以根据给定的地址,返回该地址对应的符号信息,例如函数名称、所在的......
  • 谷歌网站收录查询,教你怎么查询谷歌网站收录
    查询谷歌网站收录情况,可以通过以下几种方法来实现:一、使用GoogleSearchConsole(谷歌搜索控制台)GoogleSearchConsole是查询网站谷歌收录情况的首选工具,它提供了详细且准确的收录数据。以下是使用步骤:注册并验证网站:访问GoogleSearchConsole官网,并使用谷歌账户登录。在控......
  • Rocksdb Background Error 处理
    错误严重性等级:Status::Severity::kSoftError -ErrorsofthisseveritydonotpreventwritestotheDB,butitdoesmeanthattheDBisinadegradedmode.Backgroundcompactionsandflushmaynotbeabletoruninatimelymanner.Status::Severity::kHardErr......
  • 数字图像处理-实验4
    实验4:几何变换与变形实验4.1:图像透视变换将一幅输入图像变换为任意一个指定的四边形形状(给定四边形4个顶点)。提示:根据4个顶点的对应估计一个透视变换H,再用H对原图像进行形变(OpenCV相关函数:getPerspectiveTransform,warpPerspective等)设计一个交互程序,可以编辑四边形顶点,并且顶......
  • MongoDB 查询文档内的对象属性
    基本查询语法在MongoDB中,查询文档内的对象属性通常使用$操作符和.操作符来实现。下面是基本的查询语法:使用.操作符访问对象属性:如:【对象.属性:值】db.collection.find({"object.property":value})查询对象的嵌套字段如果我们想要查询学生中数学成绩大于80分的学生,可以使用”.”运......
  • Redis大key有什么危害?如何排查和处理?
    目录标题什么是bigkey?bigkey是怎么产生的?有什么危害?如何发现bigkey?1、使用Redis自带的--bigkeys参数来查找。2、使用Redis自带的SCAN命令3、借助开源工具分析RDB文件4、借助公有云的Redis分析服务如何处理bigkey?这个问题在面试中还是比较容易遇到的,......
  • 安全:查询域名的注册信息
    一,安装whois[root@bloglogs]#yuminstallwhois说明:whois命令不是自带命令,需要手动安装一下二,测试查询一个域名的注册信息:[root@bloglogs]#whoisnidecode.comDomainName:NIDECODE.COMRegistryDomainID:2677822529_DOMAIN_COM-VRSNRegistrarWHOISSe......