写点什么

为什么 MySQL 使用 B+ 树 (二)

  • 2019-12-26
  • 本文字数:1739 字

    阅读完需:约 6 分钟

为什么 MySQL 使用 B+ 树 (二)

设计

到了这里我们已经明确了今天待讨论的问题,也就是为什么 MySQL 的 InnoDB 存储引擎会选择 B+ 树作为底层的数据结构,而不选择 B 树或者哈希?在这一节中,我们将通过以下的两个方面介绍 InnoDB 这样选择的原因。


  • InnoDB 需要支持的场景和功能需要在特定查询上拥有较强的性能;

  • CPU 将磁盘上的数据加载到内存中需要花费大量的时间,这使得 B+ 树成为了非常好的选择;


数据的持久化以及持久化数据的查询其实是一个常见的需求,而数据的持久化就需要我们与磁盘、内存和 CPU 打交道;MySQL 作为 OLTP 的数据库不仅需要具备事务的处理能力,而且要保证数据的持久化并且能够有一定的实时数据查询能力,这些需求共同决定了 B+ 树的选择,接下来我们会详细分析上述两个原因背后的逻辑。

读写性能

很多人对 OLTP 这个词可能不是特别了解,我们帮助各位读者快速理解一下,与 OLTP 相比的还有 OLAP,它们分别是 Online Transaction Processing 和 Online Analytical Processing,从这两个名字中我们就可以看出,前者指的就是传统的关系型数据库,主要用于处理基本的、日常的事务处理,而后者主要在数据仓库中使用,用于支持一些复杂的分析和决策。



作为支撑 OLTP 数据库的存储引擎,我们经常会使用 InnoDB 完成以下的一些工作:


  • 通过 INSERTUPDATEDELETE 语句对表中的数据进行增加、修改和删除;

  • 通过 UPDATEDELETE 语句对符合条件的数据进行批量的删除;

  • 通过 SELECT 语句和主键查询某条记录的全部列;

  • 通过 SELECT 语句在表中查询符合某些条件的记录并根据某些字段排序;

  • 通过 SELECT 语句查询表中数据的行数;

  • 通过唯一索引保证表中某个字段或者某几个字段的唯一性;


如果我们使用 B+ 树作为底层的数据结构,那么所有只会访问或者修改一条数据的 SQL 的时间复杂度都是 O(log n),也就是树的高度,但是使用哈希却有可能达到 O(1) 的时间复杂度,看起来是不是特别的美好。但是当我们使用如下所示的 SQL 时,哈希的表现就不会这么好了:


SQL


SELECT * FROM posts WHERE author = 'draven' ORDER BY created_at DESCSELECT * FROM posts WHERE comments_count > 10UPDATE posts SET github = 'github.com/draveness' WHERE author = 'draven'DELETE FROM posts WHERE author = 'draven'
复制代码


如果我们使用哈希作为底层的数据结构,遇到上述的场景时,使用哈希构成的主键索引或者辅助索引可能就没有办法快速处理了,它对于处理范围查询或者排序性能会非常差,只能进行全表扫描并依次判断是否满足条件。全表扫描对于数据库来说是一个非常糟糕的结果,这其实也就意味着我们使用的数据结构对于这些查询没有其他任何效果,最终的性能可能都不如从日志中顺序进行匹配。



使用 B+ 树其实能够保证数据按照键的顺序进行存储,也就是相邻的所有数据其实都是按照自然顺序排列的,使用哈希却无法达到这样的效果,因为哈希函数的目的就是让数据尽可能被分散到不同的桶中进行存储,所以在遇到可能存在相同键 author = 'draven 或者排序以及范围查询 comments_count > 10 时,由哈希作为底层数据结构的表可能就会面对数据库查询的噩梦 —— 全表扫描。


B 树和 B+ 树在数据结构上其实有一些类似,它们都可以按照某些顺序对索引中的内容进行遍历,对于排序和范围查询等操作,B 树和 B+ 树相比于哈希会带来更好的性能,当然如果索引建立不够好或者 SQL 查询非常复杂,依然会导致全表扫描。


与 B 树和 B+ 树相比,哈希作为底层的数据结构的表能够以 O(1) 的速度处理单个数据行的增删改查,但是面对范围查询或者排序时就会导致全表扫描的结果,而 B 树和 B+ 树虽然在单数据行的增删查改上需要 O(log n) 的时间,但是它会将索引列相近的数据按顺序存储,所以能够避免全表扫描。

数据加载

既然使用哈希无法应对我们常见的 SQL 中排序和范围查询等操作,而 B 树和 B 树和 B+ 树都可以相对高效地执行这些查询,那么为什么我们不选择 B 树呢?这个原因其实非常简单 —— 计算机在读写文件时会以页为单位将数据加载到内存中。页的大小可能会根据操作系统的不同而发生变化,不过在大多数的操作系统中,页的大小都是 4KB,你可以通过如下的命令获取操作系统上的页大小:


Go


$ getconf PAGE_SIZE4096
复制代码


本文转载自 Draveness 技术博客。


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


2019-12-26 17:26927

评论

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

photoshop色轮插件Coolorus怎么安装 附Coolorus 许可证

南屿

Coolorus mac版 PS调色插件 Coolorus许可证 Coolorus安装教程

App加固:不同类型和费用对比

堡垒机和数据库防水坝的区别一二

行云管家

数据库 网络安全 堡垒机 数据库防水坝

Lightroom预设资源-高级食物lr预设 附lr预设导入教程

南屿

高级食物lr预设 Lightroom预设下载 lr预设怎么导入

软件测试/测试开发/全日制/测试管理丨Android WebView 技术原理

测试人

软件测试

微店获得微店商品详情 API(micro.item_get)在电商中的发展

技术冰糖葫芦

API

软件测试/测试开发/全日制/测试管理丨iOS 自动化相关工具

测试人

软件测试

软件测试/测试开发/全日制/测试管理丨兼容性测试

测试人

软件测试

NFTScan | 01.08~01.14 NFT 市场热点汇总

NFT Research

NFT NFT\ NFTScan

LED透明显示屏前景发展怎么样?

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家 市场 #研发

如何定位和优化程序CPU、内存等性能之巅

雪奈椰子

FCPX插件-动态视频运动模糊视觉特效 mMotion Blur 支持Intel和Apple M芯片

南屿

fcpx动态视频 运动模糊视觉特效 fcpx插件下载 fcpx特效

ps一键磨皮插件Delicious Retouch 5怎么安装 支持M芯片

南屿

磨皮插件 Photoshop 插件

AE蓝宝石插件BorisFX Sapphire 2024 for Mac破解版 及新功能介绍

南屿

30款绚彩天空背景特效PS渐变-Photoshop天空渐变

南屿

ps渐变 天空背景特效 Photoshop素材

外贸自建站推广为何首选谷歌广告?谷歌广告的优势在哪?

九凌网络

荣耀开发者大会2023 · 一张图读懂设计分论坛

荣耀开发者服务平台

AI 设计 开发者大会 honor

如何利用 APM 追踪完整的类函数调用

心有千千结

APM Datadog OpenTelemetry 系统可观测性 DDTrace

PS磨皮滤镜降噪插件Imagenomic Professional 支持ps2024 兼容M1

南屿

磨皮插件 ps滤镜下载 Imagenomic Imagenomic Professional

Authing 入选中国信通院《 2023 高质量数字化转型产品及服务全景图》

Authing

中国信通院 信通院 Authing

软件测试/测试开发/全日制/测试管理丨多设备管理平台 STF

测试人

软件测试

云联接:揭开SD-WAN神秘面纱,颠覆你对网络的认知!

博文视点Broadview

实用fcpx插件:Photo Montage(轻松制作照片动画)

南屿

fcpx fcpx插件

FxFactory 8 Pro for Mac v8.0.12激活版下载(视觉特效处理包)

影影绰绰一往直前

5分钟带您了解DRS录制回放

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟

电子签章接口调用,以契约锁为例

Geek_2a38d5

电子签章 契约锁

ScaleUp插件使用方法 附ScaleUp for Mac破解版资源

南屿

高级视频增强工具 ScaleUp插件下载 ScaleUp mac破解版 AE/PR插件

软件测试/测试开发/全日制/测试管理丨CSS Selector

测试人

软件测试

SD-WAN服务简介及挑选服务商指南

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

eBPF运行时安全

统信软件

安全 ebpf 运行时

Sketch Measure for Mac中文破解版 sketch标注插件下载

南屿

Sketch Measure mac中文版 sketch标注插件

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