2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

为什么 MongoDB 使用 B 树 (一)

  • 2019-12-26
  • 本文字数:1182 字

    阅读完需:约 4 分钟

为什么 MongoDB 使用 B 树 (一)

为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。如果你有想要了解的问题,可以在文章下面留言。


我们在这一系列前面的文章曾经分析过 为什么 MySQL 使用 B+ 树,有读者在文章下面留言,希望能出一个为什么 MongoDB 使用 B 树的对比文章,这是一个比较好的问题,MySQL 和 MongoDB 两种不同类型的数据库使用了相似却不同的数据结构,为什么 MySQL 选择使用 B+ 树而 MongoDB 使用 B 树呢?

概述

MongoDB 是一个通用的、面向文档的分布式数据库1,这是官方对 MongoDB 介绍。区别于传统的关系型数据库 MySQL、Oracle 和 SQL Server,MongoDB 最重要的一个特点就是『面向文档』,由于数据存储方式的不同,对外提供的接口不再是被大家熟知的 SQL,所以被划分成了 NoSQL,NoSQL 是相对 SQL 而言的,很多我们耳熟能详的存储系统都被划分成了 NoSQL,例如:Redis、DynamoDB2 和 Elasticsearch 等。



NoSQL 经常被理解成没有 SQL(Non-SQL)或者非关系型(Non-Relational)3,不过也有人将其理解成不只是 SQL(Not Only SQL)4,深挖这个词的含义和起源可能没有太多意义,这种二次解读很多时候都是为营销服务的,我们只需要知道 MongoDB 对数据的存储方式与传统的关系型数据库完全不同。


MongoDB 的架构与 MySQL 非常类似,它们底层都使用了可插拔的存储引擎以满足用户的不同需求,用户可以根据数据特征选择不同的存储引擎,最新版本的 MongoDB 使用了 WiredTiger 作为默认的存储引擎5



作为 MongoDB 默认的存储引擎,WiredTiger 使用 B 树作为索引底层的数据结构,但是除了 B 树之外,它还支持 LSM 树作为可选的底层存储结构,LSM 树的全称是 Log-structured merge-tree,你可以在 MongoDB 中使用如下所示的命令创建一个基于 LSM 树的集合(Collection)6:


JavaScript


db.createCollection(    "posts",    { storageEngine: { wiredTiger: {configString: "type=lsm"}}})
复制代码


我们在这篇文章中不仅会介绍 MongoDB 的默认存储引擎 WiredTiger 为什么选择使用 B 树而不是 B+ 树,还会对 B 树和 LSM 树之间的性能和应用场景进行比较,帮助各位读者更全面地理解今天的问题。

设计

既然要比较两个不同数据结构与 B 树的差别,那么在这里我们将分两个小节分别介绍 B+ 树和 LSM 树为什么没有成为 WiredTiger 默认的数据结构:


  • 作为非关系型的数据库,MongoDB 对于遍历数据的需求没有关系型数据库那么强,它追求的是读写单个记录的性能;

  • 大多数的数据库面对的都是读多写少的场景,B 树与 LSM 树在该场景下有更大的优势;


上述的两个场景都是 MongoDB 需要面对和解决的,所以我们会在这两个常见场景下对不同的数据结构进行比较。


本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/whys-the-design-mongodb-b-tree


2019-12-26 17:281375

评论

发布
暂无评论
发现更多内容

2023年MQTT Broker技术选型时需要考虑的7个因素

EMQ映云科技

云原生 物联网 IoT mqtt 企业号 4 月 PK 榜

厚礼蟹!阿里最新SpringBoot核心笔记,一夜爆火于Github。

Java你猿哥

Java Spring Boot JAVA开发 SSM框架

人人自媒体的时代,程序员该如何利用好自己的优势?我记住了这些神器...

浅羽技术

工具 自媒体 写作技巧 三周年连更

面对“失业焦虑”我们可以尝试自媒体分享| 社区征文

浅羽技术

三周年征文

应用部署引起上游服务抖动问题分析及优化实践方案

京东科技开发者

应用部署 jsf 企业号 4 月 PK 榜 上游服务抖动

文盘Rust -- 用Tokio实现简易任务池

京东科技开发者

rust runtime tokio 企业号 4 月 PK 榜

高可靠多层板制造服务再获认可!华秋荣获创想三维优秀质量奖

华秋电子

BAT必刷!GitHub顶级“2023并发编程全优笔记”晋升公司架构组!

Java你猿哥

Java 多线程 面经 SSM框架 多线程并发

欧洲 KubeCon 2023 前瞻|相约全球顶级云原生开源盛会

Daocloud 道客

云原生 HPC cncf 调度器 #Kubernetes#

SpringBoot 多Module Proguard混淆(Gradle)

Java你猿哥

spring Spring Boot proguard

华秋干货分享:SMT钢网文件的DFA(可焊性)设计

华秋电子

被裁后,狂刷大牛分享的607页JUC源码分析笔记,立马拿蚂蚁offer

Java 高并发 JUC JCF 集合框架

爆肝一月!527页文档详解SpringCloud微服务和分布式系统实践

小小怪下士

Java 分布式 微服务 后端 SpringCloud

后端开挂!一个接口实现CRUD操作,这款工具绝了!

Java你猿哥

Java 接口 后端 crud

业内首份!医疗数据安全政策汇编发布(附下载)

极盾科技

数据安全

得帆云DeMDM,业内首家基于低代码技术构建的主数据管理平台

得帆信息

低代码 数据治理 数据清洗 主数据管理 主数据管理平台

还傻傻分不清MySQL回表查询与索引覆盖?

架构精进之路

MySQL 数据库 三周年连更

BSN-DDC应用合约解读汇总(2023年一季度)

BSN研习社

如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)

汪子熙

SAP abap Netweaver 思爱普 三周年连更

【问题解决】解决 swagger2 默认地址失效

Java你猿哥

Java JAVA开发 swagger2 java项目

RocketMQ入门:(整合springboot)单机部署&集群部署

Java你猿哥

Java RocketMQ Spring Boot 架构师

Spring自定义参数解析器设计

京东科技开发者

spring 自定义参数解析器 参数解析器 企业号 4 月 PK 榜

BSN-DDC基础网络详解(八):部署自定义智能合约

BSN研习社

中移链系统合约管控功能介绍

BSN研习社

近两年功能增加最多!Kubernetes 1.27 正式发布

Daocloud 道客

Kubernetes 云原生

低成本,全流程!基于PaddleDepth和Paddle3D的三维视觉技术应用方案

飞桨PaddlePaddle

人工智能 飞桨 PaddlePaddle 三维视觉

华为19级大佬10年心血终成百页负载均衡高并发网关设计实战文档

Java 负载均衡 高并发 网关设计

狂追ChatGPT:开源社区的“平替”热潮

OneFlow

GitHub上疯传数万次!蚂蚁内部绝密分布式高可用算法笔记太香了

Java 分布式 高可用 算法

300+页!卷王级别Java面试宝典-阿里服务端开发与面试知识手册!

Java你猿哥

Java spring JVM 面经 SSM框架

为什么 MongoDB 使用 B 树 (一)_语言 & 开发_Draveness_InfoQ精选文章