9 月 13 日,2025 Inclusion・外滩大会「开源嘉年华」正在限量报名中! 了解详情
写点什么

为什么 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:281339

评论

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

java培训:Redis和Mysql数据怎么保持一致

@零度

MySQL redis JAVA开发

云原生小课堂 | Envoy请求流程源码解析(二):请求解析

York

云原生 istio 网络 envoy Service Mesh (ASM)

云管理平台有哪些?建议选择哪家?

行云管家

云计算 多云 云管理

程序设计优化之管道数据流

有道技术团队

虎符交易所完成2月HOO回购 HOO单月涨幅高达40%

区块链前沿News

Hoo 虎符交易所 平台币

CNI 这么多,怎么选?| 容器网络系列第1期

BoCloud博云

Kubernetes 容器云 cni 容器网络平台

upload上传文件类型的限制的几种方式(element)

lo

JavaScript

理解Restful风格

蜜糖的代码注释

RESTful 接口规范 REST API 3月月更

AI算力加速之道

安第斯智能云

人工智能 深度学习 异构计算

恒源云(GpuShare)_加速pytorch训练的方法来喽~

恒源云

深度学习 PyTorch

海外主机是什么意思?与国内主机有什么区别?

行云管家

服务器 主机 服务器运维 海外 主机运维

Go学习笔记——条件判断if

为自己带盐

Go 学习笔记 3月月更

HarmonyOS UI组件在线预览,程序员直呼“不要太方便~”

HarmonyOS开发者

UI HarmonyOS

这场汇聚行业顶级大咖的Meetup,有哪些不容错过的干货?| IDP Meetup 01

Baihai IDP

人工智能 AI 生态 Meetup

web技术分享| WebRTC控制摄像机平移、倾斜和缩放

anyRTC开发者

前端 音视频 WebRTC 摄像头 web技术分享

如何高效完成ECS多环境部署?

阿里云云效

阿里云 云原生 开发 部署与维护 ECS

web前端培训:react基础面试题分享

@零度

前端开发 React

黄东旭当选 CCF 数据库专业委员会、开源发展委员会、大数据专家委员会执行委员

PingCAP

Linux之ss命令

入门小站

Linux

一文带你了解动态数组方法实现

xiaoyu

数据结构 算法 数组 java; 动态数组

作为前端上传图片的两种方法

小学僧

3月程序媛福利 3月月更

在 Nebula K8s 集群中使用 nebula-spark-connector 和 nebula-algorithm

NebulaGraph

数据库 开源 分布式系统 图数据库

31 家企业入选阿里云首期云原生加速器,共建云原生行业新生态

阿里巴巴云原生

阿里云 云原生 云原生加速器 招募 行业生态

Promise静态四兄弟,你学会了吗?

战场小包

JavaScript 前端 Promise 3月月更

豆瓣9.6分,Scala编程圣经第5版重磅来袭!

博文视点Broadview

OpenHarmony开源开发者成长计划 | 知识赋能第四期课程——标准系统HDF开发

Anna

直播 赋能 OpenHarmony

大数据Flink培训:维表Join/双流Join的方法

@零度

flink join 大数据开发

优雅的编码习惯总是让人心情愉悦(Shell篇)

XinXing

Shell Code 优雅 脚本 规范

面试官:对于宏任务和微任务,你知道多少?

是乃德也是Ned

JavaScript 面试 前端 ES6 Promise

声网崩溃数据的自动化闭环处理

声网

自动化 测试 Dev for Dev

墨天轮国产数据库沙龙 | 胡津铭:时序数据库DolphinDB,从量化金融到万物互联

墨天轮

数据库 时序数据库 DolphinDB 国产数据库

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