MySQL数据库,详解索引原理(二)
有序数组
如果我们将mysql中表的数据以有序数组的⽅式存储在磁盘中,那么我们定位数据步骤
是:
1. 取出⽬标表的所有数据,存放在⼀个有序数组中
2. 如果⽬标表的数据量⾮常⼤,从磁盘中加载到内存中需要的内存也⾮常⼤
步骤取出所有数据耗费的io次数太多,步骤2耗费的内存空间太⼤,还有新增数据的时候,为了保证数组有序,插⼊数据会涉及到数组内部数据的移动,也是⽐较耗时的,显然⽤这种⽅式存储数据是不可取的。
220链表
链表相当于在每个节点上增加⼀些指针,可以和前⾯或者后⾯的节点连接起来,就像⼀列⽕车⼀样,每节车厢相当于⼀个节点,车厢内部可以存储数据,每个车厢和下⼀节车厢相连。
链表分为单链表和双向链表。
单链表
每个节点中有持有指向下⼀个节点的指针,只能按照⼀个⽅向遍历链表,结构如下:
//单项链表
class Node1{
private Object data;//存储数据
private Node1 nextNode;//指向下⼀个节点
}
双向链表
每个节点中两个指针,分别指向当前节点的上⼀个节点和下⼀个节点,结构如
下:
//双向链表
class Node2{
private Object data;//存储数据
private Node1 prevNode;//指向上⼀个节点
private Node1 nextNode;//指向下⼀个节点
}
链表的优点:
1. 可以快速定位到上⼀个或者下⼀个节点
2. 可以快速删除数据,只需改变指针的指向即可,这点⽐数组好
链表的缺点:
1. ⽆法向数组那样,通过下标随机访问数据2. 查找数据需从第⼀个节点开始遍历,不利于数据的查找,查找时间和⽆需数据类似,
需要全遍历,最差时间是O(N)
⼆叉查找树
⼆叉树是每个结点最多有两个⼦树的树结构,通常⼦树被称作“左⼦树”(left subtree)和“右⼦树”(right subtree)。⼆叉树常被⽤于实现⼆叉查找树和⼆叉堆。⼆叉树有如下特性:
1、每个结点都包含⼀个元素以及n个⼦树,这⾥0≤n≤2。 2、左⼦树和右⼦树是有顺序的,次序不能任意颠倒,左⼦树的值要⼩于⽗结点,右⼦树的值要⼤于⽗结点。
数组[20,10,5,15,30,25,35]使⽤⼆叉查找树存储如下:
每个节点上⾯有两个指针(left,rigth),可以通过这2个指针快速访问左右⼦节点,检索任何⼀个数据最多只需要访问3个节点,相当于访问了3次数据,时间为O(logN),和⼆分法查找效率⼀样,查询数据还是⽐较快的。
但是如果我们插⼊数据是有序的,如[5,10,15,20,30,25,35],那么结构就变成下⾯这样:
⼆叉树退化为了⼀个链表结构,查询数据最差就变为了O(N)。
⼆叉树的优缺点:
1. 查询数据的效率不稳定,若树左右⽐较平衡的时,最差情况为O(logN),如果插⼊数据是有序的,退化为了链表,查询时间变成了O(N)2. 数据量⼤的情况下,会导致树的⾼度变⾼,如果每个节点对应磁盘的⼀个块来存储⼀
条数据,需io次数⼤幅增加,显然⽤此结构来存储数据是不可取的
相关文章
- 在重复和挑战性天气条件下的数据集和驾驶感知
- RocketMQ 消息集成:多类型业务消息 - 普通消息
- 资源预测数字模型搭建思路分享
- 自动驾驶车道线检测分类的虚拟-真实域适应方法
- CLIP不接地气?你需要一个更懂中文的模型
- 76小时动捕,最大规模数字人多模态数据集开源
- 为什么我要迁移 SpringBoot 到函数计算
- 综述:自动驾驶的协同感知技术
- VideoMAE:简单高效的视频自监督预训练新范式
- 美国量子专家警告:2023年将是量子计算重要转折点,企业必须做好准备
- 百年微分方程难题被解决!神经元相互作用方式有了解析解描述,作者:可以模拟大脑动力学了 | MIT
- 一文看懂DRIVE Replicator:合成数据生成加速自动驾驶汽车的开发和验证
- 如何正确定义测试阶段训练?顺序推理和域适应聚类方法
- ChiQA-一个基于20万个真实用户问题的图片问答数据集
- 搞透Kafka的存储架构,用起来直接起飞!
- 同时采用边缘和云的四个理由
- 光纤通信速率破纪录!每秒能传1.84Pbit,2倍于全球互联网总流量
- 量子CNN对数据集的测试准确率高,但存在局限性
- 未来AI计算的方向,是「水芯片」?
- Nature 盘点诺奖历史,多位得主靠「计算科学」获殊荣