为什么mysql使用了B+tree和Hash表作为索引,他们两者的区别是什么?为什么不使用数组或平衡二叉树又或者采用B-Tree呢?

所有经历,皆有因由在这里插入图片描述

1.索引是什么?索引又为什么会出现?
索引究其本质是一种对数据库表中的信息进行排序的数据结构,是为了更快的找到要操作的数据而产生的。类似于图书的目录,目录就是为了让读者更快的翻到想看的那一页。

2.上面说到更快的找到要操作的数据,那么我们就假设没有索引来进行查找会出现什么问题?
没有索引,我们查询就只能从上往下依次查找,这时的时间复杂度为O(N),计算机查询是通过磁盘IO,因此我们每次查找一行数据,都需要到磁盘相应位置去查询一条数据然后比对查询条件,其中查询时间要远远大于比对条件的时间。为了查询到目标数据,计算机会频繁的去进行磁盘IO,这之间就会耗费较大的时间,导致查询效率变低。
因此,若想提高查询效率,一种是在硬件方面去提高磁盘的IO速度,而现在磁盘IO性能的发展明显落后于CPU的发展,产生了IO瓶颈,因此这种方法很难去改善查询效率;另一种就是在软件层面给数据库添加类似于图书目录的索引,计算机不必逐行进行查找,而是根据索引直接定位到指定位置进行查找,这就大大减少了磁盘IO次数,提高计算机的查询速率。

3.我们知道了使用索引可以更快的查询到数据,但数据结构有很多,我们到底该选择哪一种数据结构才最适合数据库操作呢?

(1)** 首先我们从数组来说,根据数组的数据结构来看,数组的查询效率还是挺不错的,如果是有序数组,那么我们采用二分查找效率则会更高;数组的弊端就是插入和删除,数组为了保持内存的连续性,就会导致插入和删除效率较低;
(2)其次是链表,从链表的数据结构来分析,链表的节点不仅存放了数据,也存放了储存上一个节点或下一个节点地址的指针域,这就使链表在插入和删除的时候只需要改变节点的指针域即可,效率很不错;但是链表在存储中是非连续、非顺序的,这就导致了链表在进行查询的时候需要从头到尾,依次遍历查找,效率不高,不如人意;
(3)然后再谈Hash表,哈希表又叫散列表,是根据关键码值来进行访问的数据结构,它通过散列函数(数据库表字段与散列值的映射)来加快查找的效率,虽说它的单一查询效率很高,但经不住范围查询,这就是我们选择使用Hash或是B+tree的条件之一。
(4)最后我们谈谈树,树的种类有好几种:普通二叉树,平衡二叉树,B-Tree,B+Tree,BTree:
1.当使用普通二叉树作为索引时,可能会出现下面的情况:在这里插入图片描述
上图中就出现了左子树为空的情况,这时候查找就相当于一个单向链表,时间复杂度为O(N);
2.从上面的问题我们引出了平衡二叉树(AVL树),它通过左旋或右旋使得左右子树的高度差小于等于1,查询效率较高;但这时我们考虑另一个问题,假设我们需要存入千万级或者更高的数据量时,由于每个节点只有两个子节点,这就导致了斜体样
斜体样式式①在构建二叉树时需要多次进行的IO操作,节点海量,对构建速度有影响;②节点海量,导致二叉树高度很大,降低了操作速度;
3.上面提到了节点限制,那么是不是多节点就可以解决;多叉树就可以解决上面的问题,多叉树允许每个节点有更多的数据项和更多的子节点;之前提到的B-Tree,B+Tree,B
Tree都属于多叉树。那么为啥选择了B+树呢?
我们可以比较他们三者有什么区别:
首先,B-Tree的数据不仅存放在叶子节点,非叶子节点也存放了数据;而B+Tree和BTree则是只在叶子节点存放了数据,非叶子节点全部存放了索引;
B+Tree和B
Tree的区别在于B+Tree树的叶子结点有指向兄弟的指针,而BTree则在非根和非叶子节点增加了指向兄弟的指针;
B-TRree:
B-Tree
B+Tree:B+Tree
B*Tree:B*Tree
看完上面的区别,应该心里对三者有了大概的认识,之所有不采用B-Tree,是因为他的非叶子节点也存放了数据;
这里我举个例子,假设树高2,主键ID长度为8字节,节点指针长度为6字节,一行数据大概1k,1次IO能够获得一页16k的数据,使用B+Tree,根节点能存储16k÷(6+8)=1170条索引,那么第一层,就有1170×1170=1368900条索引,最后一层叶子节点,一个节点存储16k÷1k=16条记录,一共存储1170×1170×16=21902400条记录;但在B-Tree存储时,由于非叶子节点使用了大量空间存储数据,存放索引的指针就会变少,如若想和B+Tree存储一样的数据量,就需要增肌树高,而这就会增加磁盘IO,因此B+Tree更适合于文件索引系统;另外,B+Tree树的叶子节点使用指针连接,提高了区间访问效率,在进行范围查找时,可以通过叶子节点间的指针进行遍历,减少了磁盘IO次数,增加了效率。

TAG: It’s doesn’t matter if you win by an inch or a mile,wining is wining

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值