自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 MongoDB B+树的存储能力与层级查询:三层B+树能存多少数据?​

本文探讨了MongoDB三层B+树索引的存储能力与线上环境查看方法。通过分析B+树结构特点,在假设索引页4KB、数据页32KB、索引项20字节条件下,计算出三层B+树理论可存储约8522万条记录。实际存储量受索引字段类型、数据大小等因素影响。查看树层数可通过db.getCollection().stats()命令,获取"maximumtreedepth"等参数。文章还详细解析了索引配置参数如internal_page_max、leaf_page_max的含义,并强调实际应用中需结合业务场

2025-12-02 09:39:40 651

原创 mongodb根据索引IXSCAN 查询记录流程

摘要:MongoDB索引查询采用IXSCAN+FETCH两阶段执行模式。IXSCAN阶段通过B+树索引快速定位符合条件记录的RecordID,时间复杂度为O(logn);FETCH阶段根据RecordID获取完整文档。这种设计类似图书馆先查目录再取书,避免了全表扫描。普通索引叶子节点仅存储索引键值和RecordID,不包含完整文档数据,通过职责分离(IXSCAN处理索引、FETCH获取文档)实现高效查询。执行计划分析显示,查询"age":30时先扫描索引获取RecordID,再根据Rec

2025-11-25 09:34:50 1110

原创 MongoDB使用的是 B+树,不是你们以为的 B树

B树和B+树是多路平衡查找树的核心区别在于数据存储方式:B树所有节点存储键值对,而B+树仅叶子节点存储完整数据,非叶子节点仅作索引。B+树通过叶子节点链表实现高效范围查询,树高更低,磁盘I/O更稳定,适合数据库场景;B树查询路径可能提前终止,但范围查询效率较低。MongoDB的WiredTiger引擎实际采用B+树结构,虽官方文档可能简称为B树。二者的选择取决于具体场景对单点查询和范围查询的需求差异。

2025-11-18 09:42:39 988

原创 一文搞懂计算机数据类型:字节占用与存储原理

本文系统梳理了编程中数据类型的字节占用规律和存储机制。关键点包括:1)数据类型字节数受语言和系统位数影响,如C/C++中long在32/64位系统分别占4/8字节,而Java固定long为8字节;2)存储方式采用二进制补码,正数存原码,负数需取反加一,确保运算统一性;3)实际开发需注意语言差异,合理选择数据类型以平衡内存开销和数值范围。掌握这些底层知识对优化程序性能和调试内存问题至关重要。

2025-11-11 09:32:16 915

原创 扣子(Coze)工作流玩转古人名字剧本创作:超实用提示词攻略​

摘要:本文介绍了运用扣子工作流创作历史人物剧本的方法。通过"古人剧本创作提示词"框架,从角色定位、技能要求、输出规范四个维度,系统化还原历史人物形象。该方法要求精确标注人物性别、民族信息,以编年体形式梳理6个关键事迹,确保历史真实性与叙事完整性。最终生成包含人物生平、标题、性别、民族等信息的JSON格式文件,为剧本创作提供标准化框架。以李白为例,展示了从出生到逝世的关键事件及文学成就的完整梳理过程。

2025-11-04 09:37:14 711

原创 mongodb为什么默认不使用速度更快的hash索引?反而使B+树索引

MongoDB默认使用B+树索引而非哈希索引的原因在于综合性能考量。哈希索引虽在精确查询时具备O(1)优势,但存在三大缺陷:无法支持范围查询(如age>20)、不能直接用于排序操作、不支持复合索引的前缀匹配。而B+树索引通过有序存储特性,既能高效处理点查询(O(logn)),又能完美支持范围查询、排序和复合查询,成为数据库应对多样化查询场景的理想选择。这种设计权衡体现了工程实践中的通用性优先原则。

2025-10-29 10:47:00 715

原创 mongodb有主键_id,为什么生成系统字段$RecordId?

MongoDB中的$recordId是存储引擎(WiredTiger)使用的内部物理标识符,用于定位文档在磁盘上的位置。与用户可见的_id字段不同,$recordId是系统自动生成且可能随文档移动而变化的。通过showRecordId()方法可查看该隐藏字段。MongoDB查询时,会先通过_id索引找到对应的$recordId,再根据$recordId定位实际文档数据。IDHACK查询优化策略直接利用_id索引快速定位$recordId,提高查询效率。$RecordId数值类型自增,记录每次插入都是顺序插入

2025-10-24 09:51:38 952

原创 扣子(Coze)文案→图片→视频工作流:剪映小助手正确下载、草稿同步及无 VIP 导出教程

本文介绍了使用扣子(Coze)搭建工作流后,如何正确下载草稿并合成视频的完整流程。关键点包括:1)识别匹配的剪映小助手(需与插件同源);2)设置剪映小助手与剪映软件的草稿同步路径;3)下载工作流草稿;4)通过复合片段操作实现无VIP导出视频的技巧。重点解决了常见下载失败问题,并提供了从草稿路径查找到最终导出成片的详细步骤,帮助用户绕过VIP限制完成视频制作全流程。

2025-10-20 09:45:37 2632 3

原创 扣子(Coze)搭建 工作流(文案→提示词→图片→视频)详细步骤

在扣子(Coze)平台搭建多节点工作流需遵循五步流程:创建工作流→添加节点→配置参数→串联逻辑→试运行发布。核心环节包括:1)通过大模型节点实现文案生成和提示词优化;2)使用图像流节点生成图片;3)通过插件或大模型将图片转化为视频。关键配置要点包含:正确引用上游节点输出作为输入参数、设计精准的提示词指令、确保节点间逻辑串联。测试阶段需验证各节点输出是否符合预期,支持通过选择器节点实现条件分支等进阶优化。

2025-10-14 09:38:16 2704

原创 MongoDB源码delete分析oplog:从删除链路到核心函数实现

MongoDB oplog实现机制分析 摘要:本文深入分析了MongoDB操作日志(oplog)的核心实现机制。oplog作为固定大小的capped集合(local.oplog.rs),是MongoDB副本集数据同步的关键组件。文章详细解读了从文档删除操作到oplog记录的完整调用链,包括CollectionImpl::deleteDocument、OpObserverImpl::onDelete到最终logOp的调用过程。重点剖析了logOp方法的核心逻辑:输入验证、OpTime分配、并发控制以及通过_l

2025-10-10 09:29:15 884

原创 MongoDB源码分析慢日志:从配置到实现的完整解析

摘要:MongoDB慢日志通过Profiling机制实现,支持三级配置:0(关闭)、1(记录超过slowms阈值的操作)、2(记录所有操作)。核心实现流程包括:1)会话状态流转处理请求;2)handleRequest方法执行命令并计算耗时;3)completeAndLogOperation方法通过shouldDBProfile判断是否记录(基于profile级别、slowms阈值和sampleRate采样率)。验证结果显示,当执行时间超过配置的50ms阈值时,操作详情会被记录到db.system.profi

2025-09-29 09:29:07 1095

原创 MongoDB源码delete分析观察者getOpObserver()->onDelete

本文分析了MongoDB删除操作db.user.deleteOne({"age":2828})的执行流程和底层实现机制。删除过程采用DELETE>FETCH>IXSCAN策略,通过DeleteStage、FetchStage和IndexScan阶段协同完成。核心实现包括: 使用WriteUnitOfWork确保删除操作的原子性 通过OpObserver机制监听删除前后事件,支持复制、审计等功能 删除操作会记录到oplog中,实现数据同步 事务处理支持多文档操作的回滚和提交 该

2025-09-23 09:40:45 987

原创 MongoDB源码delete分析DeleteStage过程的WriteUnitOfWork事务

本文分析了MongoDB执行deleteOne操作时的底层事务机制。该操作采用DELETE>FETCH>IXSCAN策略,通过DeleteStage、FetchStage和IndexScan阶段协同完成。核心事务控制由WriteUnitOfWork类实现,包含四个关键步骤:1)创建事务单元并加锁;2)执行文档删除;3)提交事务;4)异常时回滚。MongoDB通过Locker管理锁资源,RecoveryUnit实现事务原子性,WiredTiger引擎处理底层事务提交/回滚。整个过程严格遵循ACID

2025-09-16 09:20:45 843

原创 Cursor和Hbuilder用5分钟开发微信小程序

快速开发微信小程序只需5分钟!使用Hbuilder和Cursor两个工具:1)下载Hbuilder创建uniapp项目;2)运行到小程序模拟器;3)安装Cursor并用自然语言描述需求生成代码;4)预览效果并上传微信平台。特别演示了wifi二维码识别功能开发,通过详细指令让Cursor自动生成包括界面设计、弹窗提示等完整代码,大幅提升开发效率。

2025-09-09 09:33:28 1248 1

原创 MongoDB源码delete分析CmdDelete过程collection()->deleteDocument

MongoDB的deleteDocument方法是实现文档删除的核心函数,主要流程包括:检查集合类型(拒绝固定集合删除)、获取文档快照并触发前置观察事件、可选保存删除文档副本、从索引目录移除记录、执行底层存储引擎删除操作,最后触发后置事件并更新调试指标。该方法严格遵循先索引后数据的删除顺序,并通过WiredTiger存储引擎实现具体删除操作,同时支持变更流等特性所需的删除文档存储功能。整个删除过程被包裹在事务中,确保操作原子性和一致性。

2025-09-02 09:19:57 730

原创 MongoDB源码delete分析CmdDelete策略DELTE>FETCH>IXSCAN执行分析

本文分析了MongoDB中deleteOne操作的执行流程和底层实现机制。deleteOne与deleteMany的主要区别在于删除文档数量,前者只删除第一个匹配文档。通过分析源码,发现deleteOne执行采用DELETE>FETCH>IXSCAN策略,核心调用链包括获取执行器、执行删除计划等步骤。具体实现中,DeleteStage通过子节点FetchStage和IndexScan获取待删除文档,最终调用collection的deleteDocument方法完成删除操作。文章详细解析了各阶段的

2025-08-26 09:41:15 834

原创 MongoDB源码delete分析CmdDelete过程

本文详细分析了MongoDB中deleteOne操作的执行过程。通过代码示例展示了deleteOne删除单条记录的基本用法,并使用explain()解析其执行计划为DELETE>FETCH>IXSCAN的三阶段流程。文章深入源码层面,梳理了从CmdDelete入口到具体删除操作的调用链,包括prepareExecution生成查询计划、getExecutorDelete获取执行器、以及最终执行删除的流程。特别分析了QueryPlanner如何为age字段索引生成IXSCAN扫描计划,并通过日志验

2025-08-19 09:59:27 802

原创 MongoDB分析insert源代码

mongo插入单条文档insert()主要分4个阶段:(1)分割文档,分批次插入(2)将文档传递给集合类插入(3)将文档传递给记录record插入(4)传递给引擎游标WiredTigerCursor插入

2025-08-12 09:35:29 1052

原创 mongodb源代码分析创建db流程分析

摘要:MongoDB创建集合的核心代码位于create_collection.cpp,通过构建BSON格式元数据文档并插入到记录存储_mdb_catalog中。数据库操作通过AutoGetOrCreateDb获取,若不存在则调用openDb创建DatabaseImpl实例并初始化。初始化过程包括验证库名合法性、加载已有集合和视图目录,其中视图目录会校验持久化视图的正确性。整个流程涉及多级锁机制确保并发安全,同时处理数据库名称冲突等异常情况。

2025-08-04 20:51:32 1127

原创 mongodb源代码分析createCollection命令创建Collection流程分析

MongoDB提供了两种创建集合的方式:隐式创建和显式创建。隐式创建是推荐的方式,当向不存在的集合插入文档时,MongoDB会自动创建该集合。显式创建则使用createCollection()方法,允许用户自定义集合的配置选项,如文档大小限制、索引等。显式创建的核心方法run会解析命令、验证参数,并调用createCollection方法执行创建动作。创建过程中,MongoDB会检查数据库和集合名称的合法性,确保不与系统名称冲突,并处理集合的存储引擎选项、索引配置等。最终,通过存储引擎(如WiredTige

2025-07-28 09:12:03 679

原创 mongodb源代码分析createCollection命令由create.idl变成create_gen.cpp过程

buildscripts/idl/idl/generator.py把create.idl转成create_gen.cpp和create_gen.h,再编译成create_gen.obj,CreateCommand对象封装命令createCollection。

2025-07-21 09:27:41 1217 1

原创 MongoDB源码分析向客户端asyncSinkMessage返回执行结果DbResponse

MongoDB请求处理流程分析:状态机从Created依次转变为Source、SourceWait、Process、SinkWait等状态。核心_processMessage方法负责处理客户端请求,主要逻辑包括:1) 解压缩消息;2) 通过handleRequest执行数据库操作获取DbResponse;3) 构建响应消息头;4) 处理getMore特殊逻辑;5) 通过_sinkMessage异步发送响应。网络层通过session_asio的asyncSinkMessage将响应写入Socket。

2025-07-15 09:28:22 824

原创 mongod源代码Find的QueryPlanner::plan评分最高计划put到cache流程分析

b.user.find({age:28}).sort({wages:1})的缓存键为eqage~awages<1>,其中eqage表示过滤条件,awages表示排序字段,<1>表示索引是否起作用。通过这种机制,MongoDB能够有效减少重复查询的优化时间,提升整体性能。

2025-07-07 10:01:55 910

原创 mongod源代码Find的QueryPlanner::plan多个执行计划评分最高计划exec流程分析

在执行db.user.find({age:28}).sort({wages:1})命令时,MongoDB通过FindCmd的run方法解析命令并生成执行计划。重点分析了getExecutorFind()方法,该方法通过QueryPlanner::plan()生成执行计划。根据命令参数,生成了两个执行计划:方案1使用age索引进行扫描,方案2使用wages索引进行扫描。经过评分,方案1的评分更高,因此被选为最终执行计划。方案1的执行流程为:IXSCAN(读取age索引范围内的数据)→ FETCH → SORT

2025-07-03 09:24:42 1111

原创 mongod源代码Find的QueryPlanner::plan解析出来1个执行计划exec流程分析

在MongoDB中,执行db.user.find({age:28})查询时,系统会调用FindCmd的run方法,经过解析命令、生成执行计划和运行执行计划三个步骤。本文重点分析了生成执行计划的过程,特别是通过getExecutorFind()方法生成执行计划的流程。执行计划通常包括IXSCAN(索引扫描)和FETCH(数据获取)两个阶段。IXSCAN负责根据索引查找数据,而FETCH则根据索引结果获取实际文档。执行计划的生成过程涉及解析查询参数、选择合适的索引,并最终生成一个执行计划树。日志记录显示,系统首

2025-06-30 09:34:59 751

原创 mongodb源代码Find命令QueryPlanner::plan生成多个执行计划指定hint一个索引方案

在MongoDB中,执行计划的生成受到多个因素的影响,包括过滤器中的字段、索引、排序、投影等。对于查询db.user.find({age:28}).sort({wages:1}),MongoDB会通过QueryPlanner::plan生成执行计划。如果age是索引字段,执行计划会先进行索引扫描(IXSCAN),然后进行数据获取(FETCH),最后进行排序(SORT)。如果wages是索引字段,执行计划会直接使用索引扫描(IXSCAN)并获取数据(FETCH)。MongoDB会根据评分选择最优的执行计划。如

2025-06-24 09:32:50 1177

原创 mongod源代码Find的QueryPlanner::plan多个执行计划选择pickBestPlan高评分策略

MongoDB查询优化器选择执行计划的过程分析:对于查询db.user.find({age:28}).sort({wages:1}),系统生成两个候选方案:方案1使用age索引进行过滤后排序(IXSCAN>FETCH>SORT_KEY_GENERATOR>SORT),方案2直接使用wages索引(IXSCAN>FETCH)。通过MultiPlanStage的评估机制,系统运行两个计划各10000次(numWorks)或直到返回101条结果(numResults)。评分机制综合考虑:基

2025-06-20 09:46:21 1271

原创 mongod源代码Find的QueryPlanner::plan解析出来2个执行计划案例流程分析

FindCmd命令生成执行计划的影响因素包括:过滤器中是否有_id字段、是否有索引字段、是否有空间索引字段、是否有TEXT索引字段、命令中是否有sort、是否有projection字段以及是否进行全表扫描。例如,在user表中,字段age和wages建立了索引。对于命令db.user.find({age:28}).sort({wages:1}),由于age是索引字段,生成执行计划IXSCAN(索引age=1)>FETCH。此外,由于wages也是索引字段,生成了排序执行计划。其他条件不符合,未生成其他

2025-06-17 09:35:59 931

原创 mongod源代码Find的QueryPlanner::plan解析出来1个执行计划案例流程分析

db.user.find({age:2});调用FindCmd的run方法,1、解析命令(过滤器、排序、返回字段)2、根据命令参数生成执行计划 3、运行执行计划。下面重点分析2、根据命令参数生成执行计划getExecutorFind()

2025-06-12 09:32:47 1069

原创 mongod源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,状态转变流程是:State::Created 》 State::Source 》State::SourceWait 》 State::Process 》 State::SinkWait 》 State::Source 》State::SourceWait。

2025-06-09 09:33:09 1017

原创 mongod源码分析session异步接受asyncSourceMessage()客户端流变Message对象

本文分析了MongoDB服务状态机中消息接收过程的关键实现。主要流程包括:1) ASIOSession从Created到Source等状态转换;2) 异步接收客户端消息的调用链,涉及_sourceMessage、asyncSourceMessage等方法;3) 消息格式解析,包含标准MsgHeader和特定数据;4) 两种线程模型(adaptive和synchronous)的处理差异;5) 底层opportunisticRead实现异步数据读取。重点剖析了动态线程模式下异步获取消息的完整流程,从网络层读取、

2025-06-05 18:13:56 1211

原创 mysql的表怎么手动迁移到MongoDB数据库

为了将MySQL中的department和user表迁移到MongoDB并进行关联join性能测试,可以采用以下步骤:首先,从MySQL导出数据为CSV文件,确保使用逗号作为分隔符,并添加标题行,将id字段改为_id。然后,使用MongoDB的mongoimport工具将CSV文件导入到MongoDB中,指定数据库、集合名称,并使用--headerline参数确保CSV的第一行作为字段名。这种方法避免了编写代码进行数据迁移,简化了迁移过程。

2025-06-03 09:55:28 506

原创 mongod源码分析session接受find命令-执行命令-返回数据给客户端-概要流程

mongo第一条命令状态转变流程是:State::Created 》 State::Source 》State::SourceWait 》 State::Process 》 State::SinkWait 》 State::Source 》State::SourceWait。session等待connection请求,状态转变流程:State::Created 》 State::Source 》State::SourceWait,最后调用_sinkMessage,将mongodb结果数据发送给客户端。

2025-05-29 09:18:45 1245

原创 mongodb语法$vlookup性能分析

在MongoDB中,查询level下有多少用户时,使用user表$vlookup department表的方法比department表$vlookup user表的方法更快。原因在于user表的_id字段有索引,而department_id字段没有索引。user表$vlookup department表的方法首先读取user表的department_id值,然后通过department表的_id字段进行关联,由于_id字段有索引,查询速度更快。而department表$vlookup user表的方法需要遍

2025-05-24 17:55:55 908

原创 mongod源码分析startSession()接受客户端connection连接过程

scheduleNextWithGuard()接口最核心的作用就是调用service_executor服务运行子模块(线程模型子模块)的schedule()接口来把状态机调度任务入队到ASIO网络库的一个全局队列(adaptive动态线程模型),如果是一个链接一个线程模型,则任务入队到线程级私有队列。和ctx->setServiceExecutor(std::make_unique<ServiceExecutorAdaptive>(ctx, std::move(reactor)));创建异步模型执行器。

2025-05-20 09:37:16 1226

原创 mongod源码分析WiredTiger存储引擎内存计算逻辑

例如,在总 RAM 为 4GB 的系统上,WiredTiger 缓存使用 1.5GB RAM (0.5 * (4 GB - 1 GB) = 1.5 GB)。相反,在总 RAM 为 1.25GB 的系统上,WiredTiger 为 WiredTiger 缓存分配了 256 MB,因为这大于总 RAM 的一半减去 1 GB (0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB)。WiredTiger 内部缓存中的集合数据未压缩,并使用与磁盘上格式不同的表示形式。

2025-05-15 09:27:47 729

原创 mongod源码分析WiredTigere存储引擎StorageEngin实例化流程

当mongod 启动时,初始化存储引擎在src/mongo/db/storage/storage_engine_init.cpp中的 initializeStorageEngine() 函数里。mongodb启动之后,数据data文件夹有几个重要文件:mongod.lock,storage.bson,WiredTiger.lock,WiredTiger,WiredTiger.wt,sizeStorer,journal等

2025-05-12 09:30:05 1408

原创 mongod4.0.7源码入口全局上下文ServiceContext分析

同步线程模式也就是一个链接一个线程模型,线程数的多少和链接数的多少成正比,链接数越多则线程数也越大。当服务端接收到客户端新连接事件通知后,会触发执行acceptCb()回调,该回调中底层ASIO库通过epol wait获取到所有的accept事件,每获取到一个accept事件就代表一个新的客户端链接,然后调用ServiceEntryPointlmp.::startSession()接口处理这个新的链接ASIOSession,整个过程递归执行,保证一次可以处理所有的客户端accept请求信息。

2025-05-09 09:39:16 1010

原创 mongodb源代码分析sql用到数据例子

mongo显示隐藏字段showRecordId(),mongo系统默认字段,自增,用于索引和记录对应关系。mongo查看数据库列表命令:show databases。mongo查看集合列表show collections。mongo查看索引getIndexes()mongo分析sql命令explain()mongo插入单条文档insert()mongo查看数据列表find()mongo切换数据库use db。客户端连接mongod服务。mongo删除一条数据。mongo修改一条数据。

2025-05-07 17:05:34 300

原创 mongod4.0.7源码分析加载mongod.conf流程

mongo配置文件是mongod.conf,如果是linux系统apt安装,默认的路径是/etc/mongod.conf。mongod启动命令手动指定路径mongod --config /etc/mongod.conf。mongod.conf配置文件常见的配置参数有net.port: 27017,storage.dbPath: /var/lib/mongodb,storage.engine: wiredTiger。

2025-05-05 16:33:35 2089

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除