二、Mysql索引种类

本文介绍了数据库索引的类型,如普通索引、唯一索引、主键、全文索引和空间索引,并详细阐述了二叉查找树(包括AVL树)和B-Tree(包括B+Tree)在索引优化中的应用。讨论了不同数据结构对查找效率的影响,并分析了平衡多路查找树如何减少磁盘I/O操作,提高查询效率。
摘要由CSDN通过智能技术生成

Normal 普通索引
表示普通索引,大多数情况下都可以使用;
Unique 唯一索引
表示唯一的,不允许重复的索引,如果该字段信息不能重复,例如注册手机号用作索引时,可设置为unique;
Primary Key是拥有自动定义的Unique约束,每个表中可以有多个Unique约束,但是只能有一个Primary Key约束;
Full Text 全文索引
表示全文收索,在检索长文本的时候效果较好,比如搜索一篇文章,在比较短的文本建议使用普通的Index即可;
SPATIAL 空间索引
空间索引是对地理空间位置数据类型的字段建立的索引,MYSQL中的地理空间位置数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON;
通过SQL语句给表添加索引
–添加普通索引
ALTER TABLE mybatis.users ADD INDEX idx_account(account) USING BTREE;

–添加唯一索引
ALTER TABLE mybatis.users ADD UNIQUE INDEX uniq_account(account) USING BTREE;

索引命名规范:非唯一索引名idx_xxx,唯一索引名uniq_xxx;

二叉查找树(二叉搜索树)

Binary Search Trees
算法动画演示:
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
在这里插入图片描述
特点:
左子树的键值小于根的键值,右子树的键值大于根的键值;
对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为2,深度为3的查找次数为3,深度为n的节点的查找次数为n,因此查找时间复杂度依赖于节点深度,如果节点很深,则查找效率降低;
为了提高二叉查找树的的查找效率,人们引入了一种新的数据结构:平衡二叉树(也叫AVL树:1962 年G. M. Adelson-Velsky 和 E. M. Landis两个人提出来的);

平衡二叉查找树(AVL Tree)

Balanced binary search trees(AVL Trees )
平衡二叉查找树(AVL树)在满足二叉查找树的条件下,还需满足任何节点的两个子树的高度最大差为1,所以它呈现出是一种左右平衡的状态;
在这里插入图片描述在这里插入图片描述
上图中左边的是AVL树,它的任何节点的两个子树的高度差<=1;
而右边的不是AVL树,其根节点的左子树高度为3,而右子树高度为1,两个子树的高度差为2;
当我们向平衡二叉树(AVL Tree)插入新的节点(或者删除新的节点),有可能打破它原有的平衡,那么它会通过旋转使其恢复平衡;
当插入新节点,失去平衡的二叉树可以概括为四种状态:LL(左左)、RR(右右)、LR(左右)、RL(右左):
在这里插入图片描述
LL: LeftLeft,也称“左左”,插入或删除一个节点后,根节点的左孩子(Left Child)的左孩子(Left Child)还有非空节点,导致根节点的左子树高度比右子树高度高2,AVL树失去平衡;

RR: RightRight,也称“右右”,插入或删除一个节点后,根节点的右孩子(Right Child)的右孩子(Right Child)还有非空节点,导致根节点的右子树高度比左子树高度高2,AVL树失去平衡;

LR: LeftRight,也称“左右”,插入或删除一个节点后,根节点的左孩子(Left Child)的右孩子(Right Child)还有非空节点,导致根节点的左子树高度比右子树高度高2,AVL树失去平衡;

RL:RightLeft,也称“右左”,插入或删除一个节点后,根节点的右孩子(Right Child)的左孩子(Left Child)还有非空节点,导致根节点的右子树高度比左子树高度高2,AVL树失去平衡;

平衡二叉查找树(AVL Tree)有什么不足?
数据所处的(高)深度决定着他的IO操作次数,数据量越大,树的高度会很高,导致IO操作次数大、耗时大;数据量比较大的时候,树的高度依然很高;

平衡多路查找树(B-Tree)

注意这里的B-Tree,并不是B减Tree,- 只是一个连接符号,人们经常这么写而已,实际上是B-Tree就是指B Tree(B树);
在这里插入图片描述
每个节点最大可以存放(路数-1)个关键字信息;
每个节点最大可以有(路数)个分支;
在这里插入图片描述
以上是3路的B-Tree数据结构在索引中的示意图;
数据查找方式:
X < 17 --> P1
X = 17 命中
17< X < 35 --> P2
X = 35 命中
X > 35 --> P3
模拟查找关键字29的过程:
根据根节点找到磁盘块1,读入内存,(磁盘I/O操作第1次)(根节点常驻内存)
比较关键字29所在区间(17,35),找到磁盘块1的指针P2;
根据P2指针找到磁盘块3,读入内存,(磁盘I/O操作第2次)
比较关键字29所在区间(26,30),找到磁盘块3的指针P2;
根据P2指针找到磁盘块8,读入内存,(磁盘I/O操作第3次)
在磁盘块8中的关键字列表中找到关键字29;

分析上面过程,发现需要3次磁盘I/O操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率,而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素,B-Tree相对于AVL Tree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率;

改进版平衡多路查找树(B+Tree)

MySQL的InnoDB存储引擎采用的就是B+Tree数据结构实现其索引结构;
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值