“云无界、端无边” OGeek 技术峰会 9月17日 南京不见不散! 了解详情
写点什么

为什么 MongoDB 使用 B 树(三)

  • 2019 年 12 月 26 日
  • 本文字数:1617 字

    阅读完需:约 5 分钟

为什么 MongoDB 使用 B 树(三)

读多写少

LSM 树是一个基于磁盘的数据结构,它设计的主要目的是为长期需要高频率写入操作的文件提供低成本的索引机制8。无论是 B 树还是 B+ 树,向这些数据结构组成的索引文件中写入记录都需要执行的磁盘随机写,LSM 树的优化逻辑就是牺牲部分的读性能,将随机写转换成顺序写以优化数据的写入。


我们在这篇文章不会详细介绍为什么 LSM 树有着较好的写入性能,我们只是来分析为什么 WiredTiger 使用 B 树作为默认的数据结构。WiredTiger 对 LSM 树和 B 树的性能进行了读写吞吐量的基准测试9,通过基准测试得到了如下图所示的结果,从图中的结果我们能发现:



  1. 在不限制写入的情况下;

  2. LSM 树的写入性能是 B 树的 1.5 ~ 2 倍;

  3. LSM 树的读取性能是 B 树的 1/6 ~ 1/3;

  4. 在限制写入的情况下;

  5. LSM 树的写入性能与 B 树的性能基本持平;

  6. LSM 树的读取性能是 B 树的 1/4 ~ 1/2;


在限制写入的情况下,每秒会写入 30,000 条数据,从这里的分析结果来看,无论那种情况下 B 树的读取性能是远好于 LSM 树的。对于大多数的系统来说,系统的查询会是写的很多倍,所以 LSM 树在写入方面的优异表现也没有办法让它成为 MongoDB 默认的数据格式。


总结

应用场景永远都是系统设计时首先需要考虑的问题,作为 NoSQL 的 MongoDB,其目标场景就与更早的数据库就有着比较大的差异,我们来简单总结一下 MongoDB 最终选择使用 B 树的两个原因:


  • MySQL 使用 B+ 树是因为数据的遍历在关系型数据库中非常常见,它经常需要处理各个表之间的关系并通过范围查询一些数据;但是 MongoDB 作为面向文档的数据库,与数据之间的关系相比,它更看重以文档为中心的组织方式,所以选择了查询单个文档性能较好的 B 树,这个选择对遍历数据的查询也可以保证可以接受的时延;

  • LSM 树是一种专门用来优化写入的数据结构,它将随机写变成了顺序写显著地提高了写入性能,但是却牺牲了读的效率,这与大多数场景需要的特点是不匹配的,所以 MongoDB 最终还是选择读取性能更好的 B 树作为默认的数据结构;


到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:


  • BigTable、LevelDB 和 HBase 的应用场景都是什么?它们的读写比例有多少?为什么使用 LSM 树作为底层的数据结构?

  • 在设计表结构时,MongoDB 与传统的关系型数据库有哪些区别?


如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。


相关文章


  1. MongoDB 官方网站 The database for modern applications https://www.mongodb.com/

  2. 分布式键值存储 Dynamo 的实现原理 https://draveness.me/dynamo

  3. NoSQL 维基百科 https://en.wikipedia.org/wiki/NoSQL

  4. NoSQL (Not Only SQL database) https://searchdatamanagement.techtarget.com/definition/NoSQL-Not-Only-SQL

  5. 『浅入浅出』MongoDB 和 WiredTiger https://draveness.me/mongodb-wiredtiger

  6. MongoDB 中的集合(Collection)与 MySQL 中的表(Table)是差不多的概念

  7. 为什么 MySQL 使用 B+ 树 · Why’s THE Design? https://draveness.me/whys-the-design-mysql-b-plus-tree

  8. The Log-Structured Merge-Tree (LSM-Tree), Patrick O’Neil, Edward Cheng, Dieter Gawlick, Elizabeth O’Neil https://www.cs.umb.edu/~poneil/lsmtree.pdf

  9. Btree vs LSM https://github.com/wiredtiger/wiredtiger/wiki/Btree-vs-LSM


本文转载自 Draveness 技术博客。


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


2019 年 12 月 26 日 17:35825

评论

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

LAXCUS分布式操作系统:云盘的使用

LAXCUS分布式操作系统

云盘 分布式存储 分布式软件系统

自回归和自编码

infoQ-LolitaAnn

人工智能 深度学习 5月月更

使用APICloud AVM框架实现App导航栏菜单

APICloud

APP开发 APICloud avm.js

Linux多线程-概念及控制

可口也可樂

c++ Linux 后端

【愚公系列】2022 年 05 月 二十三种设计模式(五)-单例模式(Singleton Pattern)

愚公搬代码

5月月更

Q1手机银行运营报告:交易规模超150万亿,月活跃用户4.9亿

易观分析

手机银行

易周金融观点 央行设立科技创新再贷款;多家银行下调大额存单利率

易观分析

金融 银行

谁在从API经济里分得一杯羹!

Liam

Postman API API Explorer平台 API boy 开放api

Git 安装及配置

Emperor_LawD

git 基础 5月月更

不仅仅是自动化,DevOps 测试工具推荐

SoFlu软件机器人

浅谈TCP和UDP协议

秋名山码民

5月月更

想要成为一名真正的软件工程师吗?加入非凸,一起升级!

非凸科技

招聘 社招 校招 软件开发工程师

Spring data JPA实践和原理浅析

领创集团Advance Intelligence Group

工作原理 java Spring JPA

淘宝京东优惠券返利机器人

91320412MA2026NF7D

淘宝电商 群聊机器人 返利 采集京东

量子计算是人工智能的未来吗?

海拥(haiyong.site)

人工智能 量子计算 5月月更

易观分析刘怡:技术投入聚焦降本增效,用技术赋能人提升企业能效

易观分析

人口变化 技术赋能

InfoQ AI开发者召集令!快来助力中国AI产业发展,参与抽奖!

InfoQ写作社区官方

AI 热门活动 白玉兰开源

博睿数据获得分布式系统稳定性实验室成员单位证书 亮相全球信息系统稳定性峰会

博睿数据

IMUSTLOST网站开发——实战一【imustlost】【自己学习开发项目系列】【Django】【mysql】【html】【css】【JavaScript】【jqurey】

上进小菜猪

MySQL django 网站开发 5月月更

开源之夏 2022 重磅来袭!欢迎报名 RadonDB 社区项目!

RadonDB

数据库 开源 RadonDB 开源之夏

认清大脑中的一对塑料姐妹花,科学解锁情绪密码

图灵教育

效率 职场 脑科学

Apache Calcite SQL解析及语法扩展

不穿格子衬衫的程序员

数据库 sql 大数据 flink Apache Calcite

OceanBase 3.2.3 发版|HTAP引擎全面升级,TPC-H性能10倍提升!

OceanBase 数据库

oceanbase

Tech Talk 宣传 | 如何高效、极简构造无服务器 Web 应用

亚马逊云科技 (Amazon Web Services)

Web

攻克编译器技术(2)

刘旭东

源代码 编译器原理 5月月更

一文搞定 Flutter 文件下载和管理

岛上码农

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

为 GPU 而来,焱融科技推出新一代全闪分布式文件存储产品

焱融科技

人工智能 云计算 高性能 文件存储 高计算

代码历史上最昂贵的 7 个错误

禅道项目管理

测试 代码

设计模式专题之Proxy静态代理与动态代理

不想秃头

Java 程序员 设计模式 动态代理 静态代理

首届腾讯云大数据峰会暨Techo TVP开发者峰会

首届腾讯云大数据峰会暨Techo TVP开发者峰会

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