mysql的索引种类4种_二、Mysql索引种类

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

01815e8b60f3e03ae650e841a85f1618.png

特点:

左子树的键值小于根的键值,右子树的键值大于根的键值;

对该二叉树的节点进行查找发现深度为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,所以它呈现出是一种左右平衡的状态;

c9e856aaac397c6193f28989499fde57.png

df855089a40578513e7caf4e3b87951e.png

上图中左边的是AVL树,它的任何节点的两个子树的高度差<=1;

而右边的不是AVL树,其根节点的左子树高度为3,而右子树高度为1,两个子树的高度差为2;

当我们向平衡二叉树(AVL Tree)插入新的节点(或者删除新的节点),有可能打破它原有的平衡,那么它会通过旋转使其恢复平衡;

当插入新节点,失去平衡的二叉树可以概括为四种状态:LL(左左)、RR(右右)、LR(左右)、RL(右左):

c3c240e68838e03f1118ad39cd91358d.png

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树);

0b782451a66675cd4ed25afdd8979fe6.png

每个节点最大可以存放(路数-1)个关键字信息;

每个节点最大可以有(路数)个分支;

c5bb6668397d098b83d7330fa68a3adf.png

以上是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数据结构实现其索引结构;

9a5dc72dcb60af3639d48f1ca8baaed6.png

1fffb5e460ccf10231938e63be3593d9.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值