MySQL索引学习

1.索引是什么?
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。索引是由存储引擎实现的,而MySQL的存储引擎是表级的,同一个数据库的不同表可以使用不同的引擎。索引并非越多越好,正确的创建合适的索引是提升数据库查询性能的关键。

索引是表索引字段和记录行的物理地址构成。索引和表是分开存储的。索引不宜过多(一般一张表最好不要超过5个索引),一张两千万数据的普通表,几个索引的体积就可以1GB.
在这里插入图片描述
2.为什么要使用索引?
1.索引是极大的减少存储引擎需要扫描的数据量。
2.可以把随机IO变成顺序IO(这里指的是MySQL的B+Tree索引)
3.索引可以帮助我们在进行分组,排序等操作时,避免使用临时表。

3.心里要有点B树: MySQL的B+Tree索引结构引入

树的节点结构如下,每个节点存储数据字段关键字,记录行物理地址,下一个节点的指针。
在这里插入图片描述

看下如下几种树结构,来分析下MySQL为什么要使用B+Tree作为索引结构呢?
3.1 BST (Binary Search Tree)
数据结构模拟图地址:

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

在这里插入图片描述
二叉树存在数据存储极端情况,变成了链表了,查找也就变成全表扫描了。即二叉树存在不平衡问题。

3.2 平衡二叉树
平衡二叉树AVL,无论插入多少数据,整棵树都可以保持相对平衡,即任意节点的子节点高度差不超过1,当高度超过1后,就会通过旋转的方式恢复平衡。
在这里插入图片描述
AVL树通过节点的左旋,右旋解决了数据分布的平衡问题。AVL树作为索引仍未存在一些问题:
1.存储的数据太少。一个节点存储一个数据,一次IO只加载了一个数据,浪费资源。
2.由于问题1的存在会导致树的高度很大,一次数据库从中会查询遍历太多节点,需要更多次IO操作。
3.查询稳定性差,如查询数据在根部位置和在叶子位置,查询效率差距十分大,效率为O(N).

3.2 多路平衡查找树 :B-Tree
为了解决AVL树不足之处,引入了多路平衡查找树,B-Tree是一颗绝对平衡的树,即所有叶子节点都在相同高度上。如下是一个23树,只要定义足够多的路数,每个节点就可以存储足够多的索引,就会有更多的度数,那么这颗多路平衡树就会更加“矮胖”,因此搜索需要遍历的节点就更少。

对比AVL树,高度为3时AVL树最多只可以存储7个索引值。而23树则可以存储将近30个索引值,如果定义更多的路数,可以存储更多索引值。
在这里插入图片描述
3.2.1. B-Tree所有节点都存储数据行
3.2.2. B-Tree是一颗绝对平衡的树,通过向上分裂的方式保持树的平衡,如下图是插入索引35后平衡过程。

在这里插入图片描述
4. MySQL的索引结构:B+Tree
4.1 B+Tree的特点:
a. B+Tree节点关键字搜索采用左闭合区间
b. B+Tree非叶子节点不保存数据相关信息,只保存关键字和子节点的引用。
c. B+Tree关键字对应的数据存在叶子节点上。
d. B+Tree叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系。
在这里插入图片描述
4.1 B+Tree树相比B-Tree优势?
a. B+Tree是B-Tree的变种,具有B-Tree的优势。
b. B+Tree具有更强的扫描能力,只需要扫描叶子节点即可,B-Tree需要扫描全部节点;
c. B+Tree非叶子节点不保存数据,一次IO可以读取更多的索引,因此B+Tree的磁盘读写能力更强;
d. B+Tree叶子节点天然有序;
e. B+Tree的查询效率更加稳定,不管在那个节点命中索引,最终数据都是在叶子节点命中,多次查询时间都是近似相等的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值