索引以及索引底层数据结构

news/2025/2/21 22:41:43/

一、什么是索引?

索引(index)是数据库高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式指向真在的数据,这种数据结构就是索引。

二、为什么选择B+树

为什么不使用二叉树、B树,要使用B+树呢?

1、二叉树

在看B+ 树之前,我们先看一下二叉树 

左边这个二叉树的时间复杂度是O(log n),而右边这个二叉树查询的时间复杂度是O(n),就已经退化成一个链表了,二叉树的时间复杂度不稳定

2、红黑树

那么为什么不实用红黑树呢?

优点:红黑树的时间复杂度很稳定,它的时间复杂度是O(log n)

缺点:红黑树也是一个二叉树,每个节点只有两个分叉(只有两个字节点),如果要存储1000万的数据,那么它的层级就会很高(很多层),如果要查数据的话,还是不够高

3、B-树

B-Tree,B树是一种多叉路平衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。

以一棵最大度数为5(5阶)的B-Tree举例,那这个B树的每个节点最多存储4个key。 

灰色部分是指针,指向子节点的数据,子节点的数据大小都在两个蓝色数据之间

蓝色部分表示数据(key,键值)

绿色部分表示真正的数据(索引指向的数据)

跟二叉树一样,里面的数据都是左边小右边大,但是相比二叉树来说,由于最多有4个key和多个分支,B树的层级就比较短,可以称为矮胖树。层级短,查询的效率就高

4、B+树

B+树是在B树的基础上进行的一种优化,使其更适合实现外存储索引结构,InnerDB存储引擎就是使用的B+树实现其索引结构

首先,B+树也是多阶的,不同的点在于,

1、B+树的非叶子节点,只存储指针和key,不存储数据

2、上面的非叶子节点,只用来找到叶子节点的数据,而且非叶子节点上的数据也能在叶子节点上找到,比如图中的38、58等

3、叶子节点之间使用双向指针进行互相连接,如图中的6,12和16,18相连

相比于B树,B树有以下几个优势:

1、磁盘读写代价相比B+树更低;

如图中所示,如果要查询12 这个数据,由于B树的非叶子节点也是包含数据的,所以B树会加载出38中的(指针、key、数据),再加载出16和29中的(指针、key、数据),最后查询到12中的(指针、key、数据);

而B+树只有在叶子节点存储数据,非叶子节点只保存 指针和key值,只会查询12中的数据,前面的38和16则只和他们对比了key值,还有就是使用了38和16中的指针

2、查询效率B+树更加稳定

由于B+树的数据都保存在叶子节点,所以要查询什么数据,所要查询的层级(高度)是差不多的,查询效率更稳定

3、B+树便于扫库和区间查询

比如我们要查询6-34之间的数据,B+树,只要查询到6,再往右,使用双向指针进行查询到34为止即可,区间查询很快

综上所述优点,MySQL使用了B+树的索引结构


http://www.ppmy.cn/news/1573668.html

相关文章

详细介绍:封装简易的 Axios 函数获取省份列表

目录 关键步骤: 完整代码(html): 代码解析: 程序运行结果: 本示例展示了如何通过封装一个简易的 myAxios 函数来模拟 axios 的功能,使用原生的 XMLHttpRequest(XHR)对…

青少年编程都有哪些比赛可以参加

Python小学生可参加的赛事: 电子学会青少年编程考级、中国计算机学会编程能力等级认证、蓝桥杯、 信奥赛CSP-J/S初赛/NOIP(推荐C)、编程设计、信息素养、科技创新赛; 升学助力(科技特长生、大学)、企业、出国留学; python比赛&am…

基于Flask的第七次人口普查数据分析系统的设计与实现

【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …

Linux 常用命令 - echo 【输出一行文字】

简介 echo 命令源自英文单词 “echo”,意为“回声”或“反馈”。在 Linux 系统中,它主要用于在终端显示一行文字,是一种输出字符串或变量到标准输出(通常是屏幕)的简单方式。这个命令在显示信息、调试脚本以及组合其他…

html css js网页制作成品——HTML+CSS+js茉酸奶的茶网页设计(5页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML

【HappyBase】连接hbase报错:ecybin.ProtocolError: No protocol version header

问题 使用以下代码访问 hbase 时出现错误: ecybin.ProtocolError: No protocol version header def test_hbase():import happybase# 通过size控制连接池中的连接数量# pool happybase.ConnectionPool(size3, host"192.168.1.2", port9090, protocolcomp…

A与B组件自动对齐与组装,无映射直接补偿。

网上针对组装的从视觉到控制动作,要不就是收费,要不就是简单介绍。这么详细的比较难找~ 手下留情,不喜勿喷! Show time~ 分步解决方案: 标定阶段(Calibration) 9点张氏标定(每个位置A1、A2、B1、B2): 使用机械手在相机视野内沿Z字形路径移动,覆盖9个点(XY方…

微信小程序---计划时钟设计与实现

微信小程序-计划时钟已上线,欢迎各位小伙伴的测试和使用~(微信小程序搜计划时钟即可使用) 在这篇博客中,我们将探讨如何在微信小程序中设计和实现一个任务管理功能,该功能允许用户添加、删除和查看任务。任务管理系统的核心是基于日期和时间的任务管理,可以设置任务的开…