1.深入理解MySql索引底层数据结构和算法

1.什么是索引

索引是数据库获取数据时排好序的数据结构;重点理解(排好序)

2.存储索引的数据结构

2.1 二叉树

    每个节点最多有2个子节点的树结构(左边的节点比父节点小,右边的节点比树节点大);包含:红黑树、完全二叉树、二叉搜索树、平衡二叉树、平衡二叉搜索树、满二叉树、B-tree、B+tree。

2.2 红黑树

    红黑树是一种平衡二叉查找树,通过在每个节点上增加一个存储位来表示节点的颜色(红色和黑色),并通过一系列规则确保树保持平衡,从而保证最坏的情况下的时间复杂度是O(log n)。为防止二叉树倾斜成链表,添加了红色和黑色两种颜色的选转规则,有以下四个特点:

  • 根节点是黑色
  • 所有叶子节点都是黑色
  • 每个红色节点的子节点都是黑色
  • 任一节点到每个叶子节点的所有路径都包含相同数据的黑色节点

2.3 Hash表

  是一种特殊的数据库索引类型,某些特殊场景也会使用Hash表存储索引。有以下几个特点:

  • 对索引的key进行一次hash计算就可以定位出数据存储的位置
  • 仅能满足“=”和“in”的索引,不能使用范围查询
  • 若发生Hash碰撞,则采取链表的形式进行存储

2.4 B-Tree

  一种平衡的多路查找树,能够保持数据有序,使得查找数据、顺序访问、插入和删除都能在短时间内完成的数据结构,有以下几个特点:

  • 叶节点据有相同的深度,叶节点指针为空
  • 所有索引元素不能为空
  • 节点中的数据索引从左到右递增排列
  • 每个叶节点都会包含数据

2.5 B+Tree

  一种N叉排序树,是B-tree的变种,有着比B-Tree更高效的的查询性能;有以下几个特点:

  • 叶节点不存储数据,只存储索引
  • 存在冗余索引,删除和插入更高效
  • 最底层叶子节点存储所有索引
  • 叶子节点之间使用指针链接,提高访问性能
  • 存储数据量大,以3层树高度为例: 每个存储节点大约16K,每个字符索引大约8个b,地址指针大约6b,每条数据大约1kb

(16kb/14B) * (16kb/14B) *(16kb/1kb) 约等于两千万条数据

3.以上几种索引存储结构对比

名称

mysql是否使用

原因

二叉树

1.高度不稳定,I/O次数较多

2.数据倾斜(链接结构)模型下变成线性链表,查询效率极低

红黑树

1.高度不稳定,I/O次数较多

Hash表

1.特殊场景使用,例如在名称检索中,只包含“=”和“in”的查询,通过一次hash值就能定位地址位置,比b+tree还高效,2.不能使用范围查询

B-Tree

为什么使用b-tree而不适用b+tree?

1.b+tree高度更低,b-tree每个节点都存储了数据,导致每层存储的索引更少,相对高度更高,增加了I/O的次数

2.b+tee的检索范围更广,b-树从根节点开始多次查找和对比,每次节点都需要分裂和合并,增加复杂性和时间开销,b+树叶子节点是用链表相连,查询范围更广,速度更快

B+Tree

4.MySql存储引擎

存储引擎决定mysql中索引和数据的存储方式,存储引擎的粒度以表为单位,以user表为例

4.1 MyISAM存储引擎

非聚集索引,存储三个文件

user.frm 表结构

user.MYD 表数据

user.MYI 索引

使用b+tree数据存储结构,索引存存储在myi文件中,表数据存储在myd文件中,通过找到查找索引对应的数据磁盘位置,找到数据;

4.2 InnoDb 存储索引

聚集索引,存储两个文件

***.frm表结构

***.ibd表数据和索引

  • 表数据文件按照b+tree的数据结构形成的索引文件
  • 聚集索引结构情况下叶节点包含了所有的行数据
  • 二级索引结构情况下包含字段索引值和聚集索引的值,查找到二级索引时会进行聚集索引回表

5 聚集索引、非聚集索引、二级索引、联合索引

  • 聚集索引:索引和数据在同一个文件中为聚集索引
  • 非聚集索引:索引和数据不在同一个文件中为非聚集索引
  • 二级索引:非聚集索引也成为二级索引,他是在表的非主键上建立的索引
  • 联合索引:由多个字段组成的索引,遵循最左侧匹配原则,联合索引结构如下

6.问题

6.1为什么建议InnoDb表必须建主键?

  • InnoDb索引存储结构使用B+tree的数据结构,主键作为B+tree的索引键,按照顺序存储,并且使用指针链接,可以大大提高检索效率;
  • 若不建立主键,数据库会默认建立一个隐藏字段rowid设置主键,创建数据文件时效率低下

6.2主键为什么建议整数递增?

  • 整数相对于字符串、uuid等内存占用小,查找和比较时更方便
  • 根据b+tee的特性,叶子节点数据是连续且递增的,递增可以防止叶节点数据分裂和重组,减少数据结构的变化,递增只需要不断增加新的叶节点即可

6.3为什么非主键索引结构叶子节点存储的主键值?

  • 为节约空间:一张表可能有多个非主键索引,如果每个索引都存放数据,导致会占用很多空间
  • 保证数据一致性:如果非主键索引叶节点也存储数据,当数据发生改变时,需要更改每个索引对应的数据,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值