<span>027-B树(二)</span>

 

 

https://cloud.tencent.com/developer/article/1441681

不知道你有没有这种感觉,那些所谓的数据结构和算法,在日常开发工作中很少用到或者几乎不曾用到,可能只是在每次换工作准备面试的时候才会捡起来学习学习。

那我希望今天这篇文章能让你对数据结构的具体应用能有个初步的概念,就从我们每天都在用的 mysql 数据库说起吧。

今天这个标题,严格来说其实是不正确的,我在前面的文章中有这么解释过:执行一条sql语句都经历了什么?

首先,mysql 主要是由 server 层和存储层两部分构成的。server 层主要包括连接器、查询缓存,分析器、优化器、执行器。存储层主要是用来存储和查询数据的,常用的存储引擎有 InnoDB、MyISAM,MySQL 5.5.5版本后使用 InnoDB 作为默认存储引擎。

这篇文章我们主要讨论 mysql 的存储层,不同的存储引擎其底层的数据结构是不一样的,我们这里就以默认的 InnoDB 为例,所以严格来说应该是 InnoDB 为啥要选择 B+ 树这种数据结构来存储数据。

在文章正式开始之前,你先要知道 mysql 中的 InnoDB 在底层是采用 B+ 树这种数据结构来存储数据的。你先记住就好了,下面我们再来一步一步解释为什么。

  • 几种常见的数据结构

首先你要知道,mysql 的索引主要是为了提高查询效率的,那一定得找一个合适的数据结构来存储数据,哈希表、数组、二叉搜索树这三种常见的数据结构都可以提高查询效率。

  • 哈希表

哈希表就是一种以键值对来存储数据的结构,你可以通过一个 key 就可以很快的查询出对用的 value 值。哈希表主要是利用了数组的随机访问特性,实现思想主要是通过一个哈希函数把 key 转换成一个哈希值,这个哈希值就对应数组中的某个下标。

但是由于哈希表是无序的,区间查询效率会非常的慢,所以哈希表通常只用于查询单个值。

  • 有序数组

数组就好说了,数组具有连续性和随机访问特性,因此数组都能很高效的进行单个等值查询和区间查询,但是 mysql 不仅仅是查询数据,还会有插入和删除数据的操作。

在有序数组中插入或删除一个数据会需要批量移动数组中其他数据,这是一个不小的消耗,影响性能。因此有序数组适合处理静态数据,比如一些过往的不会再修改的数据。

在这里你可能会问,既然哈希表其实也是利用了数组的特性,那有了数组为啥还需要哈希表呢。是因为数组下标 key 只能是数字,而哈希表可以支持字符串 key,哈希函数可以把这个 key 转换成一个数组下标。

同时,不同的 key 如果通过哈希函数转换成了相同的数组下标,这就会造成冲突,在哈希表中一般会通过再拉出一个链表来保存这个冲突的值。

关于哈希表这里就不再多说了,后面的文章再详细解释哈希表的原理以及相关应用。

  • 二叉搜索树

注意,二叉搜索树和二叉树不一样,二叉树是指每个节点的左儿子小于父节点,父节点又小于右儿子,即二叉搜索树的中序遍历就是一个有序序列。

由于索引不仅仅是存在内存中,还会存储在硬盘中,因此就会涉及到 IO 性能了,就要求树的高度不能太高。实际上 B+ 树就是通过二叉搜索树推演改进的,我将在后面的文章再详细解释这个改进过程。

  • 小结

哈希表适合等值查询,由于是无序的,区间查询会很慢。

有序数组适合等值和区间查询,但是数组具有连续性,插入和删除操作都可能需要移动其他元素。

二叉搜索树由于树的高度,区间查询需要中序遍历,都会导致查询效率很慢。

注意,在一些文章中经常会把 B+ 树说成 B 树或者 B-tree,这其实是错误的,B 树和 B+ 是两种不同的树,B+ 树是 B 树的一个优化,后面的文章我会再详细解释这个优化过程。

而且 B- 树其实也就是 B 树,这个符号并不是加减中的减号,并不是所谓的 "B 减树",只是一个连接符号而已。

全部评论

相关推荐

xtu大迫杰:偶遇校友,祝校友offer打牌
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
7549次浏览 68人参与
# 你的实习产出是真实的还是包装的? #
1426次浏览 37人参与
# 巨人网络春招 #
11249次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7218次浏览 38人参与
# 简历第一个项目做什么 #
31401次浏览 317人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186653次浏览 1116人参与
# MiniMax求职进展汇总 #
23387次浏览 304人参与
# 研究所笔面经互助 #
118814次浏览 577人参与
# 重来一次,我还会选择这个专业吗 #
433143次浏览 3924人参与
# 简历中的项目经历要怎么写? #
309747次浏览 4172人参与
# 面试紧张时你会有什么表现? #
30432次浏览 188人参与
# AI时代,哪些岗位最容易被淘汰 #
62996次浏览 764人参与
# 正在春招的你,也参与了去年秋招吗? #
362936次浏览 2635人参与
# 你怎么看待AI面试 #
179594次浏览 1197人参与
# 职能管理面试记录 #
10763次浏览 59人参与
# 网易游戏笔试 #
6402次浏览 83人参与
# 腾讯音乐求职进展汇总 #
160489次浏览 1107人参与
# 校招笔试 #
468616次浏览 2959人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
7071次浏览 156人参与
# 你觉得通信/硬件有必要实习吗? #
155408次浏览 1065人参与
# 小红书求职进展汇总 #
226976次浏览 1357人参与
# 从哪些方向判断这个offer值不值得去? #
56718次浏览 357人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务