MySQL

47-MySQL-索引的数据结构选择的合理性

2022-10-03  本文已影响0人  紫荆秋雪_文

一、不使用任何数据结构

因为没有使用任何的数据结构,只能全表遍历查询

二、Hash结构

Hash 本身是一个函数,又被称为散列函数,它可以帮助我们大幅提升检索数据的效率。Hash算法是通过某种确定性的算法(如:MD5、SHA1、SHA2、SHA3)将输入转变为输出。相同的输入永远可以得到相同的输出,假设输入内容有微小偏差,在输出中通常会有不同的结果

如果想要验证两个文件是否相同,那么不需要两份文件直接拿来比对,只需要让对方把 Hash 函数计算得到的结果告诉你即可,然后在本地同样对文件进行 Hash 函数的运算,最后通过比较这两个 Hash 函数的结果是否相同,就可以知道这两个文件是否相同

1、加速查找速度的数据结构

1.1、树:例如平衡二叉搜索树,查询/插入/修改/删除的平均时间复杂度都是 O(log2N)

1.2、Hash:如HashMap,查询/插入/修改/删除的平均时间复杂度都是 O(1) Hash.png

在Hash的方式下,一个元素k处于h(k)中,即利用哈希函数h,根据关键字k计算出槽的位置。函数h将关键字域映射到哈希表T[0 . . .m-1]的槽位上

哈希存储.png

2、Hash结果效率高,那为什么索引结构要设计成树形?

3、Hash索引的适用性

show variables like '%adaptive_hash_index';

三、二叉搜索树

如果利用二叉树作为索引结构,那么磁盘的 IO 次数和索引树的高度是相关的

1、二叉搜索树的特点

2、查找规则

先来看下最基础的二叉搜索树,搜索某个节点和插入节点的规则一样,加入搜索插入的数值为key

四、AVL树

为了解决上面二叉搜索树退化成链表的问题,又提出了 平衡二叉搜索树,又称为AVL树(有别于 AVL 算法),它在二叉搜索树的基础上增加了约束,具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。常见的平衡二叉树有很多种,包括了平衡二叉搜索树、红黑树、树堆、伸展树。平衡二叉搜索树是最早提出来的自平衡二叉搜索树,当我们提到平衡二叉树时一般指的就是平衡二叉搜索树。数据查询的时间主要依赖于磁盘 I/O 的次数,如果我们采用二叉树的形式,即使通过平衡二叉搜索树进行了改进,树的深度也是 O(log2N),当 n 比较大时,深度也是比较高的

平衡二叉树.png

五、B-Tree

B树也就是 多路平衡查找树。简写为 B-Tree。它的高度远小于平衡二叉树的高度。B 树作为多路平衡查找树,它的每一个节点最多可以包括 M 个子节点,M 称为 B 树的阶。每个磁盘块中包括了关键字子节点的指针。如果一个磁盘块中包含了 x 个关键字,那么指针数就是 x+1。对于一个 100 阶的 B树来说,如果有 3 层的话最多可以存储约 100 万的索引数据。对于大量的索引数据来说,采用 B树的结构是非常适合的,因为树的高度要远小于二叉树的高度

B-Tree.png

2、小结

六、B+Tree

B+树也是一种多路搜索树,基于 B 树做出了改进,主流的 DBMS 都支撑 B+树的索引方式,比如 MySQL。相比于 B-Tree,B+Tree适合文件索引系统

1、B+ 树和 B 树的差异

2、B+Tree

一个B+树,阶数为3,根节点中的关键字1、18、35 分别是子节点(1、8、14),(18、24、31)和(35、41、53)中的最小值。每一层父节点的关键字都会出现在下一层的子节点的关键字中,因此在叶子节点中包括了所有的关键字信息,并且每一个叶子节点都有一个指向下一个节点的指针,这样就形成了一个链表

B+Tree.png

2、B+树的存储能力如何?为何说一般查找行记录,最多只需1~3次磁盘IO

InnoDB存储引擎中页的大小为 16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为 4 或 8 个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K 取值为 10^3。也就是说一个深度为 3 的B+Tree索引可以维护 10^3 * 10^3 * 10^3 = 10亿条记录。这里假定一个数据页也存储 10^3条航记录数据)。实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree 的高度一般都在 2~4 层。MySQL的InnoDB 存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘 I/O操作

3、为什么说B+树比B树更适合实际应用总操作系统的文件索引和数据库索引

4、Hash 索引与B+树索引的区别

5、Hash索引与B+树索引是在建索引的时候手动指定的?

七、R树

R-Tree在MySQL很少使用,仅支持 geometry数据类型 ,支持该类型的存储引擎只有MyISAM、bdb、 innodb、ndb、archive几种。举个R树在现实领域中能够解决的例子:查找20英里以内所有的餐厅。如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中,一个字段记录经度,另一个字段记录纬度。这样的话我们就需要遍历所有的餐厅获取其位置信息,然后计算是否满足要求。如果一个地区有100家餐厅的话,我们就要进行100次位置计算操作了,如果应用到谷歌、百度地图这种超大数据库中,这种方法便必定不可行了。R树就很好的 解决了这种高维空间搜索问题 。它把B树的思想很好的扩展到了多维空间,采用了B树分割空间的思想,并在添加、删除操作时采用合并、分解结点的方法,保证树的平衡性。因此,R树就是一棵用来 存储高维数据的平衡树 。相对于B-Tree,R-Tree的优势在于范围查找。

八、小结

使用索引可以帮助我们从 海量的数据中快速定位想要查找的数据,不过索引也存在一些不足,比如占用存储空间、降低数据库写操作的性能等,如果有多个索引还会增加索引选择的时间。当我们使用索引时,需要平衡索引的利(提升查询效率)和弊(维护索引所需的代价)

上一篇 下一篇

猜你喜欢

热点阅读