Mongodb源码分析之cursor(四)

本文深入分析MongoDB的查询过程,包括客户端请求、服务器端数据库加载、cursor操作和文档匹配。重点讲解了BtreeCursor、QueryOptimizerCursor及其在多plan查询中的角色。此外,讨论了MongoDB如何处理无索引和有索引情况下的排序,以及深层次嵌套文档的匹配策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询部分:
1. mongo客户端的请求
2. mongod配置服务器端对数据库的加载
3. mongod query中cursor操作
4. mongodb的document匹配

mongod query中cursor操作

几个关于mongodb的游标概念:

在这里插入图片描述

basicCursor: 直接扫描整个collection的游标,可设置初始的扫描位置,扫描为顺序扫描.

ReverseCursor: 反向扫描游标,相对于顺序扫描,这里是反向扫描.

GeoCursorBase: 空间地理索引游标的基类.

BtreeCursor: mongodb的一般数据索引扫描游标,这个游标完成对于索引的扫描.

QueryOptimizerCursor: 经过优化的扫描游标。
多plan扫描时用于优化查询的游标. 这里将简单描述其流程:

  1. 如果是类似这种db.coll.find()的查询则将直接返回一个BasicCursor的游标扫描全表.

  2. 如果是简单的id查询如db.coll.find(_id:xxx),在查询计划允许直接查询_id索引的情况下,返回一个_id索引的BtreeCursor.

    查询计划:对于每个查询,查询计划程序在查询计划缓存中搜索适合 query shape 的查询计划。如果没有匹配到合适的查询计划,则查询计划程序会生成候选计划,以便在试用期内进行评估。查询计划程序选择获胜计划,创建包含获胜计划的缓存条目,并使用它来生成结果文档。
    在这里插入图片描述

  3. 根据查询整理出查询值的范围,作为优化查询范围的依据,如:db.coll.find({x:{ l t : 100 , lt:100, lt:100,gt:20}}),那么这里其范围就是[20.100],这个范围只有在对应的变量是索引的情况下起作用,如x为其中的一个索引,那么这里的范围将帮助其游标BtreeCursor首先直接将查询范围定位到[20,100]的位置&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值