在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

评论

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

JVM Sandbox入门教程与原理浅谈

Zhendong

Java JVM

mysql的高可用方案以及优缺点

想要飞的猪

2022-11-14:rust语言,请使用过程宏给结构体AAA生成结构体AAABuilder和创建AAABuilder实例的方法。 宏使用如下: #[derive(Builder)] pub stru

福大大架构师每日一题

rust 福大大 过程宏

IO原理(一):从BIO到NIO

苏格拉格拉

Linux io nio 多路复用

一年前端面试打怪升级之路

loveX001

JavaScript

面试官:React怎么做性能优化

beifeng1996

React

透视用户需求深挖服务潜力:2022中国商业查询行业洞察

易观分析

商业 查询

SpringBoot3正式版将于11月24日发布:都有哪些新特性?

艾小仙

Java spring-boot spring、

前端面试如何回答,这些题目或许可以给你一些提示

loveX001

JavaScript

MySQL事务的隔离级别以及脏读、幻读和不可重复读

闫同学

MySQL 事务 11月月更

初始Java诊断工具-Arthas

石臻臻的杂货铺

Java Arthas 11月月更

ISO 8601持续时间格式

HoneyMoose

构建高质量的持续交付体系

老张

软件工程 持续交付

浅谈MVC、MVP、MVVM框架模式

闫同学

mvc MVP MVVM 11月月更 框架模式

算法题学习---删除链表的倒数第n个节点

桑榆

算法题 11月月更

Linux中传输文件如何做到又快又安全?同学,scp命令了解一下!

wljslmz

Linux 运维 scp 11月月更

这些js原型及原型链面试题你能做对几道

loveX001

JavaScript

开发和学习时需要造一些kafka消息,于是写了段脚本实现,在这里记录备忘,后面会常用到

程序员欣宸

kafka 11月日更

Thymeleaf入门教程

Studying_swz

前端 thymeleaf 11月月更

【Dubbo源码】SPI机制源码解析

石臻臻的杂货铺

dubbo 11月月更

python小知识-单元测试

AIWeker

Python python小知识 11月月更

湖仓一体电商项目(十):业务实现之编写写入DWD层业务代码

Lansonli

湖仓一体 11月月更

湖仓一体电商项目(十一):编写写入DWS层业务代码

Lansonli

湖仓一体电商项目 11月月更

面试官:说说Event Loop事件循环、微任务、宏任务

loveX001

JavaScript

从0开始,让你的Spring Boot项目跑在Linux服务器

闫同学

spring Linux 服务器 11月月更

指标体系搭建中需要规避的问题

穿过生命散发芬芳

指标体系 11月月更

OWASP API安全漏洞类型

阿泽🧸

11月月更 OWASP API

自制操作系统日记(5):跳转到C语言执行

操作系统

基础逻辑门

芯动大师

Verilog 11月月更 Xilinx

倒计时3天!银行APP用户体验外滩峰会嘉宾阵容抢先看!

易观分析

App 银行

湖仓一体电商项目(九):业务实现之编写写入DIM层业务代码

Lansonli

湖仓一体电商项目 11月月更

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