QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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

评论

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

新的方式-谷歌浏览器插件的使用【天猫超市抢购飞天茅台】

谙忆

探索 React 合成事件

Geek_z9ygea

大前端 React 28天写作

Synchronized 精讲

伯阳

Java 多线程 高并发 synchronized java关键字

助力ARM生态 —Dragonwell新增aarch64支持

阿里云基础软件团队

12月阿里蚂蚁金服四面(已拿offer)Java技术面经总结:项目+源码+jvm调优+MySQL

Java 学习 编程 程序员 面试

重学JS | 改变函数上下文的3种方式

梁龙先森

大前端 编程语言 28天写作

SpringBoot太强了、ShardingSphere上榜

spring 编程 框架

漫谈分层架构:为什么要进行架构分层?

AI乔治

Java 架构 高可用系统的架构 高可用架构

synchronized只会用不知道原理?一文搞定

Java鱼仔

Java 面试 并发 synchronized

三分钟快速详细安装CentOS

程序员的时光

Linux centos 程序员 28天写作

跨界

张老蔫

28天写作

精选算法面试-队列

李孟聊AI

算法 队列 28天写作

Spring5.0源码学习系列之Spring AOP简述

AI乔治

Java spring 架构

记录一下我离线依赖迁移安装的具体尝试过程

blueju

JavaScript 大前端 npm Node webpack

Spring Boot 使用slf4j进行日志记录

武哥聊编程

Java springboot SpringBoot 2 slf4j 28天写作

计算机网络基础

roadup

TCP 网络 HTTP 计算机 HTTP3.0

突然明白 npm install xxx 的业务实际用处

blueju

大前端 npm

redis中的一致性hash

原来不悔

redis 一致性hash

架构师训练营第七周作业

zamkai

CSS ( Cascading Style Sheets )

roadup

CSS

扫盲帖:聊聊微服务与分布式系统

AI乔治

Java 架构 微服务 分布式系统

巧合?达摩院2021十大科技是十九世纪那场幻想的升级版?

Java架构师迁哥

数仓建设中最常用模型--Kimball维度建模详解

五分钟学大数据

大数据 数据仓库 数仓 维度建模

异步I/O -- posix aio 从入门到放弃的吐血实践

1412

workflow srpc 异步调度 posix aio kqueue

网线如何制作和如何使用?

我与你地铁高峰期的邂逅,背后竟然是?

脑极体

python 输入输出

赵开忠

Python 28天写作

前端性能优化

roadup

大前端 性能调优

不可多得的干货!耗时两个礼拜,8000字安卓面试长文,内含福利

欢喜学安卓

android 程序员 面试 移动开发

原理竟然是这!GitHub上标星13k的《Android面试突击版》,醍醐灌顶!

欢喜学安卓

android 程序员 面试 移动开发

读《关于中台的思考与尝试》,我竟然懂得了这么多!

李忠良

中台 方法论

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