数据库的索引和其底层数据结构

索引的CRUD

-- 查看索引
show index from 表名;

-- 创建索引
create index 索引名 on 表名(列名); 

-- 删除索引
drop index 索引名 on 表名(列名); 

创建和删除索引在大数据时都是极其耗时的操作,因为要用大量空间来创建(删除)对应的数据结构。因此大多数时候我们在创建表的最开始准备好索引

索引的数据结构

索引的存在是为了让数据查找的效率更高,因此我们需要一种合适的数据结构来保存这些数据

不合适的数据结构
  • 谈到查找最快我们大多数人想法肯定是时间复杂度为O(1)的哈希表,但是哈希表虽然查询单个数据较快,查询范围数据时效率就达不到要求。

  • 而二叉搜索树虽然查询单个数据和范围数据还可以,但是数据很有可能形成类似于单叉树的形式,这样的话时间复杂度就上升为了线性复杂度,同时搜索时的递归深度也是服务器无法接受的。

  • 那么二叉搜索树升级以后的AVL树和红黑树又如何呢?AVL树和红黑树虽然避免了搜索可能的线性复杂度,但是在大量数据的堆砌下依旧会有很大的深度,在查询时会消耗大量空间。

在这个情况下B+树应运而生,了解B+树之前我们需要先了解一下B树(也有人写为B-树)

B树简单介绍

只是简单介绍B树的优势,不会具体深究插入删除的方式,节点内数据存储方式

B树是一个n叉树,且每个节点有多个数据,先上一个完整图:

在这里插入图片描述

以父节点中的30和40为例,34、36、38属于30和40之间的数,因此就使用30和40范围的节点存储它们,一个节点有a个数,则它就有a+1个子节点。这就是B树内数据的存储方式

B+树简单介绍

介绍完了B树让我们来了解一下B+树的存储方式,并且分析为什么B+树如此受到数据库的青睐

B+树和B树一样也是一个n叉树,但与B树还有很大的不同,完整如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSzG561F-1660093289930)(C:\Users\yang\AppData\Roaming\Typora\typora-user-images\image-20220809173241303.png)]

  1. B+树一个节点有a个数,则其子节点有a个
  2. 父节点中作为右边界的数会在子节点中再次出现,如上图根节点8~15之间作为右边界的15又一次存放在了子节点。
  3. 由于每次取边界其右的数到子节点,B+树的叶子节点就保存了所有的数。我们最后把叶子节点以链表形式连接起来。

了解了B+树的数据存储方式,让我们简单聊聊B+树的优势:

  1. 首先作为一个n叉树,它的深度相比于二叉树大大减少。
  2. B+树的叶子节点储存了所有数据,我们进行范围查找时只要找到一个数就可以直接通过链表遍历所需范围。
  3. 由于叶子节点存储了所有数据,我们的所有查找操作都可以放在叶子节点进行,而非叶子节点内我们只需要存放索引即可,索引所代表的数据全部存储在叶子节点中。由于索引只是一串数字,空间占用很小,这样查找大大减少了硬盘IO,这也是红黑树等树可望而不可即的!

虽然我们在这里并不谈B+树的插入效率,但我们能够直观感受到其数据插入和删除的困难,但如开始所说数据库更多需要的还是查找效率,这种交换是值得的,但如果是插入删除极其频繁的数据库则不应该使用索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最后一只三脚兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值