写点什么

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

评论

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

满满干货!手把手教你实现基于eTS的HarmonyOS分布式计算器

HarmonyOS开发者

HarmonyOS ETS

热烈庆祝“海泰密码技术融合创新中心&数据中心重启安全工程”双中心智能重启用

电子信息发烧客

网络安全 科技 科技企业

做了5年开源项目,我总结了以下提PR经验!

OpenHarmony开发者

OpenHarmony 开源生态

小程序和App同时拥有?两者兼得的一种技术方案

Speedoooo

微信小程序 APP开发 小程序容器 小程序转app

10分钟,将微信小程序转换成App

Speedoooo

微信小程序 移动开发 小程序容器 小程序转app

为什么校招面试中“线程与进程的区别”老是被问到?我该如何回答?

宇宙之一粟

线程 进程 5月月更

什么是显卡?GPU服务器到底有什么作用?

Finovy Cloud

gpu GPU服务器

火山引擎A/B测试私有化实践

字节跳动数据平台

实验 火山引擎 私有化部署 ab测试

《阿里云代码安全白皮书》5个维度应对3类代码安全问题

阿里云云效

云计算 阿里云 代码管理 代码托管 代码安全

netty系列之:epoll传输协议详解

程序那些事

Java Netty 程序那些事 5月月更

直播预告丨Hello HarmonyOS进阶课程第四课——ArkUI动画开发

HarmonyOS开发者

HarmonyOS arkui

Apache ShenYu 网关正式支持 Dubbo3 服务代理

阿里巴巴中间件

阿里云 开源 微服务 云原生 dubbo

“双碳”大局中再看业务合同电子化

鲸品堂

节能 提效降本 双碳

Apache SeaTunnel(Incubating)与计算引擎的解耦之道,重构API我们做了些什么

Apache SeaTunnel

Apache 大数据 开源 DolphinScheduler workflow

英伟达周锡健:设计到数字营销的最后一公里

阿里云弹性计算

vr XR 视觉计算

【刷题第16天】数组中出现次数超过一半的数字

白日梦

5月月更

成本节省 50%,10 人团队使用函数计算开发 wolai 在线文档应用

阿里巴巴中间件

阿里云 中间件 函数计算

我们为什么选择使用分布式持续交付新星 Zadig ?

Zadig

DevOps 云原生 CI/CD 软件交付

Hoo研究院|区块链简报 20220523期

区块链前沿News

#区块链# Hoo 热点

使用postMessage对iframe进行跨域数据传输

空城机

iframe postMessage 5月月更

烧录OpenHarmony 3.2(尝鲜版)步骤

离北况归

OpenHarmony OpenHarmony3.2

谈谈技术能力

阿里巴巴中间件

阿里云 程序员 中间件 技术思考

SaaS应用:企业数字化转型性价比最高的方式

小炮

干货复盘 | 易观分析“出海非洲战略”专题分享

易观分析

非洲战略

使用 Provider 实现 Flutter 不相关页面状态数据共享

岛上码农

flutter ios 安卓开发 跨平台开发 5月月更

IET 试水SiFL中文项目 为中国工程师“走出去”创造宝贵机遇

E科讯

Markdown语法简介

工程师日月

markdown语法 5月月更

前端食堂技术周刊第 38 期:Remix v1.5.0、Babel v7.18.0、前端部署十五章、Tree Shaking 问题排查指南、一文搞懂前端技术发展

童欧巴

前端 Remix 前端部署

微擎同步粉丝不显示头像和昵称?

智伍应用

微擎 php开源

多款顶级好用的 Vue 表单设计器测评推荐,可拖拽生成表单

蒋川

Vue Element 组件 表单设计 Ant Design

人人皆为开发者?不可错过的低代码发展新趋势

云智慧AIOps社区

大前端 低代码 数据可视化

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