MySQL索引

1:索引本质

索引是帮助Mysql高效获取数据的排好序的数据结构(二叉树,红黑树,Hash表,B-Tree,B+Tree)

其中红黑树是一种弱平衡二叉树,树的深度较高,且每个节点只能存储一个索引,相对于B树来说浪费空间

 2:B树

将平衡二叉树的每个节点扩展至N,目的是为了减少数的高度,以至于在百万级以上的数据都可使树高控制在一定范围内。

树的高度低了,磁盘IO的次数会尽可能少,但是非叶子结点也存储data

3:B+树

  • 非叶子结点不存储DATA,只存储索引(冗余),可以存放更多索引(Mysql结点大小默认16kb)
  • 叶子节点包含所有索引字段
  • 叶子结点用双向指针(此图只显示单项指针,不精确)链接,提高区间访问能力(方便范围查找)
  • 根节点常驻内存

BigInt为8B,空白索引为6B,所以一个节点可存储16K/14B=1170个索引信息。所以三层B+树可存放1170*1170*每个节点可存放的Data数(假设16) =  2190万份数据。

4:MyISAM引擎实现查找(此引擎的表有三个文件)(非聚集)(引擎形容表)

  1. .frm文件存储表的结构(表的字段,类型等)
  2. .MYD文件存储叶节点数据(数据库中真正记录的数据)
  3. .MYI文件存储B+树存储信息(树结构)

查找时先根据索引字段在.MYI文件中根据索引树查找数据节点,再根据查找到的节点在内存(调入MYD文件)中查找实际数据

 

5:InnoDB引擎实现查找(此引擎的表有两个文件)(聚集)

  • 表数据按照B+树结构存储
  • 聚集索引节点包含了完整的数据记录
  • InnoDB表必须有主键,且推荐使用整型的自增数据(对索引树好维护)
  • 为什么非主键索引结构叶子节点存储的是主键值(一致性和节省存储空间)
  • 如果创建时未指定主键,系统会根据每一列可唯一区分的属性作为主键值,如果还是没有,则innodb会默认创建一个id作为主键(索引),且自增主键更容易维护B+树。
  • 多个索引有多个B+树,但是非主键索引叶子节点不存储完整数据,只存储主键值,为了保持一致性和节省存储空间(如上3)
  1. .frm文件存储表结构(表的字段,类型等)
  2. .ibd文件存储索引和真正的数据

注:聚集索引解释:就是把索引和数据相结合在叶子节点上,将索引和数据结合在一个文件,在最后读取数据时减少一次IO提高效率

视频地址:https://www.bilibili.com/video/av73372462

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值