常见的数据结构和数据库的设计方法

本文详细介绍了常见的数据结构,如散列表、链表、二叉查找树、平衡二叉树(AVL树)、B-树和B+树,重点讨论了它们在数据库设计中的应用。同时,概述了数据库设计的六个阶段,强调了规范化法在设计中的重要性,并给出了数据库选型的常见选项,如MySQL、Oracle和DB2。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见的数据结构

散列表(哈希表)

散列表(也称哈希表)是根据关键码值(Key value)而直接进行访问的数据结构,它让码值经过哈希函数的转换映射到散列表对应的位置上,查找效率非常高。

哈希索引主要用于memory引擎中

1、针对哈希索引,只有精确匹配索引所有列的查询才有效,比如在列(A,B)上建立了哈希索引,如果只查询数据列 A,则无法使用该索引

2、哈希索引并不是按照索引值顺序存存储的,所以也就无法用于排序,也就是说无法根据区间快速查找

3、哈希索引只包含哈希值和行指针,不存储字段值,所以不能使用索引中的值来避免读取行,不过,由于哈希索引多数是在内存中完成的,大部分情况下这一点不是问题

4、哈希索引只支持等值比较查询,包括 =,IN(),不支持任何范围的查找,如 age > 17

链表

双向链表支持顺序查找和逆序查找,索引是按照大小顺序进行存储的

什么是跳表?简单地说,跳表是在链表之上加上多层索引构成的。

在这里插入图片描述

跳表是能满足需求的,实际上它的结构已经和B+树非常接近了,只不过B+树是从平衡二叉查找树演化而来的而已

二叉查找树

图中的圆为二叉查找树的节点,节点中存储了键key和数据data。键对应user表中的id,数据对应user 表中的行数据。

二叉查找树的特点就是任何节点的左子节点的键值都小于当前节点的键值,右子节点的键值都大于当前节点的键值。顶端的节点称为根节点,没有子节点的节点称之为叶节点。

平衡二叉树

平衡二叉树又称 AVL 树,在满足二叉查找树特性的基础上,要求每个节点的左右子树的高度差不能超过 1

平衡二叉树保证了树的构造是平衡的,当插入或删除数据导致不满足平衡二叉树不平衡时,平衡二叉树会进行调整树上的节点来保持平衡。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。

B-树

因为内存的易失性。一般情况下都会选择将user表中的数据和索引存储在磁盘这种外围设备中。但是和内存相比,从磁盘中读取数据的速度会慢上百倍千倍甚至万倍,所以应当尽量减少从磁盘中读取数据的次数。另外从磁盘中读取数据时,都是按照磁盘块来读取的,并不是一条一条的读。如果能把尽量多的数据放进磁盘块中,那一次磁盘读取操作就会读取更多数据,那查找数据的时间也会大幅度降低。

如果用树这种数据结构作为索引的数据结构,那每查找一次数据就需要从磁盘中读取一个节点,也就是说的一个磁盘块。

二叉树的节点将会非常多,高度也会极其高,查找数据时也会进行很多次磁盘 IO,查找数据的效率将会极低

B 树相对于平衡二叉树,每个节点存储了更多的键值key和数据data,并且每个节点拥有更多的子节点,子节点的个数一般称为阶,例如B树为3阶B树,高度也会很低。基于这个特性,B树查找数据读取磁盘的次数将会很少,数据的查找效率也会比平衡二叉树高很多。

在BTree的机构下,就可以使用二分查找的查找方式,查找复杂度为【层高*log(结点数)】,一般来说树的高度是很小的,一般为3左右,因此BTree是一个非常高效的查找结构

B树的一些特点:

关键字集合分布在整颗树中

任何一个关键字出现且只出现在一个结点中

搜索有可能在非叶子结点结束

其搜索性能等价于在关键字全集内做一次二分查找

B树在插入删除新的数据记录会破坏B-Tree的性质,因为在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质

B+树

主要区别就是所有的节点值都在最后叶节点上用双向链表连接在了一起

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rxcCgpHa-1616665918339)(file:///C:/Users/21288/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]

但是二叉树不能使用,因为比对次数太多,所以使用多叉树以减少比对次数

B+Tree中的非叶子结点不存储数据,只存储键值,非叶子节点可以看成索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字

B+Tree的叶子结点没有指针,所有键值都会出现在叶子结点上,且key存储的键值对应data数据的物理地址

B+Tree的每个非叶子节点由n个键值key和n个指针point组成

B+Tree对比B-Tree

磁盘读写代价更低:每个节点中的key个数越多,那么树的高度越小,需要I/O的次数越少,因此一般来说B+Tree比BTree更快,因为B+Tree的非叶节点中不存储data,就可以存储更多的key。

查询速度更稳定。由于B+Tree非叶子节点不存储数据data,因此所有的数据都要查询至叶子节点,而叶子节点的高度都是相同的,因此所有数据的查询速度都是一样的。

​ B+树的查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值