首页

文章

mysql 索引结构是btree还是b+tree

发布网友 发布时间:2022-03-24 21:59

我来回答

2个回答

热心网友 时间:2022-03-24 23:28

第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。
第二部分结合MySQL数据库中MyISAM和InnoDB数据存储引擎中索引的架构实现讨论聚集索引、非聚集索引及覆盖索引等话题。
第三部分根据上面的理论基础,讨论MySQL中高性能使用索引的策略。

热心网友 时间:2022-03-25 00:46

详细解答,仅供参考。
教科书上的B+Tree是一个简化了的,方便于研究和教学的B+Tree。然而在数据库实现时,为了更好的性能或者降低实现的难度,都会在细节上进行一定的变化。下面以InnoDB为例,来说说这些变化。
04 - Sparse Index中的数据指针
在“由浅入深理解InnoDB索引的实现(1)”中提到,Sparse Index中的每个键值都有一个指针指向所在的数据页。这样每个B+Tree都有指针指向数据页。
如果数据页进行了拆分或合并操作,那么所有的B+Tree都需要修改相应的页指针。特别是Secondary B+Tree(辅助索引对应的B+Tree), 要对很多个不连续的页进行修改。同时也需要对这些页加锁,这会降低并发性。为了降低难度和增加更新(*和合并B+Tree节点)的性能,InnoDB 将 Secondary B+Tree中的指针替换成了主键的键值。
这样就去除了Secondary B+Tree对数据页的依赖,而数据就变成了Clustered B+Tree(簇索引对应的B+Tree)独占的了。对数据页的拆分及合并操作,仅影响Clustered B+Tree. 因此InnoDB的数据文件中存储的实际上就是多个孤立B+Tree。
一个有趣的问题: 当用户显式的把主键定义到了二级索引中时,还需要额外的主键来做二级索引的数据吗(即存储2份主键)? 很显然是不需要的。InnoDB在创建二级索引的时候,会判断主键的字段是否已经被包含在了要创建的索引中.
接下来看一下数据操作在B+Tree上的基本实现。
- 用主键查询
直接在Clustered B+Tree上查询。
- 用辅助索引查询
A. 在Secondary B+Tree上查询到主键。
B. 用主键在Clustered B+Tree上查询到数据。
可以看出,在使用主键值替换页指针后,辅助索引的查询效率降低了。
A. 如果能用主键查询,尽量使用主键来查询数据。
B. 但是由于Clustered B+Tree包含了完整的数据,遍历的效率比 Secondary B+Tree的效率低。如果遍历操作不涉及到二级索引和主键以外的数据,则尽量使用二级索引进行遍历。

- INSERT
A. 在Clustered B+Tree上插入一条记录
B. 在所有其他Secondary B+Tree上插入一条记录(仅包含索引字段和主键)
- DELETE
A. 在Clustered B+Tree上删除一条记录。
B. 在所有Secondary B+Tree上删除二级索引的记录。
- UPDATE 非键列
A. 在Clustered B+Tree上更新数据。
- UPDATE 主键列
A. 在Clustered B+Tree删除原有的记录(只是标记为DELETED,并不真正删除)。
B. 在Clustered B+Tree插入一条新的记录。
C. 在每一个Secondary B+Tree上删除原有的记录。(有疑问,看下一节。)
D. 在每一个Secondary B+Tree上插入一个条新的记录。
- UPDATE 辅助索引的键值
A. 在Clustered B+Tree上更新数据。
B. 在每一个Secondary B+Tree上删除原有的记录。
C. 在每一个Secondary B+Tree上插入一条新的记录。
更新键列时,需要更新多个页,效率比较低。
A. 尽量不用对主键列进行UPDATE操作。
B. 更新很多时,尽量少建索引。
05 – 非唯一键索引
教科书上的B+Tree操作,通常都假设”键值是唯一的“。但是在实际的应用中Secondary Index是允许键值重复的。在极端的情况下,所有的键值都一样,该如何来处理呢?InnoDB 的 Secondary B+Tree中,主键也是此二级键的一部分。 Secondary Key = 用户定义的KEY + 主键。
注意主键不仅做为数据出现在叶子节点,同时也作为键的一部分出现非叶子节点。对于非唯一键来说,因为主键是唯一的,Secondary Key也是唯一的。当然,在插入数据时,还是会根据用户定义的Key,来判断唯一性。按理说,如果辅助索引是唯一的(并且所有字段不能为空),就不需要这样做。可是,InnoDB对所有的Secondary B+Tree都这样创建。
还没弄明白有什么特殊的用途?有知道的朋友可以帮忙解答一下。
也许是为了降低代码的复杂性,这是我想到的唯一理由。
弄清楚了,即便是非空唯一键,在二级索引的B+Tree中也可能重复,因此必须要将主键加入到非叶子节点。
06 – <Key, Pointer>对

标准的B+Tree的每个节点有K个键值和K+1个指针,指向K+1个子节点。
而在“由浅入深理解索引的实现(1)”中图. 9的B+Tree上,每个节点有K个键值和K个指针。InnoDB的B+Tree也是如此。
这样做的好处在于,键值和指针一一对应。我们可以将一个<Key,Pointer>对看作一条记录。这样就可以用数据块的存储格式来存储索引块。因为不需要为索引块定义单独的存储格式,就降低了实现的难度。
- 插入最小值
当考虑在变形后的B+Tree上进行INSERT操作时,发现了一个有趣的问题。如果插入的数据的健值比B+Tree的最小键值小时,就无法定位到一个适当的数据块上去(<Key,Pointer>中的Key代表了子节点上的键值是>=Key的)。例如,在图.5的B+Tree中插入键值为0的数据时,无法定位到任何节点。在标准的B+Tree上,这样的键值会被定位到最左侧的节点上去。这个做法,对于图.5中的B+Tree也是合理的。Innodb的做法是,将每一层(叶子层除外)的最左侧节点的第一条记录标记为最小记录(MIN_REC).在进行定位操作时,任何键值都比标记为MIN_REC的键值大。因此0会被插入到最左侧的记录节点上。

07 – 顺序插入数据
标准的B-Tree*时,将一半的键值和数据移动到新的节点上去。原有节点和新节点都保留一半的空间,用于以后的插入操作。当按照键值的顺序插入数据时,左侧的节点不可能再有新的数据插入。因此,会浪费约一半的存储空间。
解决这个问题的基本思路是:*顺序插入的B-Tree时,将原有的数据都保留在原有的节点上。创建一个新的节点,用来存储新的数据。顺序插入时的*过程.
以上是以B-Tree为例,B+Tree的*过程类似。InnoDB的实现以这个思路为基础,不过要复杂一些。因为顺序插入是有方向性的,可能是从小到大,也可能是从大到小的插入数据。所以要区分不同的情况。如果要了解细节,可参考以下函数的代码。

btr_page_split_and_insert();
btr_page_get_split_rec_to_right();
btr_page_get_split_rec_to_right();
InnoDB的代码太复杂了,有时候也不敢肯定自己的理解是对的。因此写了一个小脚本,来打印InnoDB数据文件中B+Tree。这样可以直观的来观察B+Tree的结构,验证自己的理解是否正确。
如何为职务侵占罪进行辩护 职务侵占如何辩护 职务侵占罪有效辩护点有哪些 miui11开发者选项在哪_小米miui11开发者选项在哪 查询考研成绩需要什么 考研查分前要做什么 考研查询需要什么证件 研究生什么专业好 什么专业的研究生最好 考研究生什么专业好 研究生学什么专业 宝石花的养殖方法介绍 宝石花怎么养才长得好 不想让老婆看到我电脑里的一些东西怎么办? 桥好路由器停电后在来电老是获取lp 勒索病毒加密的文件如何恢复? TPU贴合膜多少钱 华为手机如何将输入法改为简体 肉丝炒金针菇做法 仓储冷链信息怎么申报 什么是药品冷链物流 浙江食品冷链运输多少钱 生物冷链具备什么资质 投诉检测站最有效办法 冢君的解释 304C型钢厂 真诚推荐 永浩供 乌鲁木齐球墨铸铁厂家排名 2023年抖音618好物节招商规则 2023年抖音好物年货节好物直播间玩法说明 抖音2023好物年货节玩法攻略 互联网内容平台——小红书的优势与困境 ...女儿房间的空调洗一下滤网,问一下格力小金豆空调面罩怎么打开... 传真机和打印机有什么区别? 传真纸和打印纸哪个好 传真纸和复印纸哪个好 虚拟语气as though 的问题 We didn't know his telephone number, otherwise we would have teleph... 我想问一下 错综复杂条件句 那怎么不能使用在这里 if i can do this... 好可怕...好可怕的梦... 线束组装线束组装工艺要求 汽车线束英语翻译 带表卡尺怎么读数 带表卡尺的使用方法 压力变送器数显表 公主连结凯露表情包大全 臭鼬表情包图片一览[多图] 单眼皮怎么使用双眼皮贴? 咬人的那特小的虫子叫什么 Bose音响怎么连接蓝牙 博士音响蓝牙怎么连接 夹了一片菜叶,上面摆了七根鱼刺和在碗里放了七个汤勺,每个汤勺里放一根... 微信聊天记录怎么才能彻底删除?通过这几种操作可以确保隐私安全!_百度... IDM IDMShellExt64.dll无法删除 - 删除使用中的(进程相关或残留)文件... 写关于活动的句子100字 mysql innodb存储引擎,聚集索引和辅助索引,采用什么数据结构 为什么mysql的数据结构用的是b+而不是b mysql 索引有几种类型 mysql采用哪些索引,B树索引解释下 为什么MySQL数据库索引选择使用B+树 索引数据结构都有哪些? 分别有什么区别呢? 一般都采用什么结构的呢? 请问mysql索引,有主键索引、唯一索引、全文索引、组合索引、普通索引,他们分别的数据结构是什么? mysql索引使用的是Btree还是B+tree?为什么 mysql 索引有哪些?各⽤用了了哪些数据结构 mysql索引的数据结构,为什么用b+树 mysql索引采用什么数据结构 想买个红米手机,note8和note8pro哪个更不会发热呢? 小米8对比红米note8 手机redmi note8和redmi note8pro哪个性价比高? 红米note8和红米note8Pro,哪个能用久一点不卡? 红米note8和note8pro哪个好 200元的差距,红米Note8相比于Note8 Pro差了多少? 红米note8和红米note8pro哪个更好? 当我拿到红米Note8与Note8 pro,横向对比,区别到底有多大呢? 主板后面的音频插口好多,我的耳机该插哪个? MySQL 索引是怎么实现的? 《mysql索引背后的数据结构及算法原理》pdf下载在线阅读全文,求百度网盘云资源 MySQL有哪些索引类型 mysql innodb 索引到底是b+树还是b树? mysql有几种索引类型?使用索引时都有那些地方要注意 mysql索引类型解释 mysql底层的数据结构是怎么样的 什么叫摄像轴线? 轴线的分类有哪些? 电影拍摄的轴线和轴线规律 好莱坞电影镜头轴线 遵从轴线规律的拍摄的9个机位分别是什么?9种越轴处理方法是哪9种? 摄影中,什么是光轴 ? 电影中的摄像机越轴,到底是什么意思,能不能举个 什么叫轴线规律 摄像轴线的问题 摄影里什么叫做越轴 谁说一下什么是180度拍摄? 试听语言之摄影机轴线:怎样才能合理的越轴 轴线是什么
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com