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引擎实现查找(此引擎的表有三个文件)(非聚集)(引擎形容表)
- .frm文件存储表的结构(表的字段,类型等)
- .MYD文件存储叶节点数据(数据库中真正记录的数据)
- .MYI文件存储B+树存储信息(树结构)
查找时先根据索引字段在.MYI文件中根据索引树查找数据节点,再根据查找到的节点在内存(调入MYD文件)中查找实际数据
5:InnoDB引擎实现查找(此引擎的表有两个文件)(聚集)
- 表数据按照B+树结构存储
- 聚集索引节点包含了完整的数据记录
- InnoDB表必须有主键,且推荐使用整型的自增数据(对索引树好维护)
- 为什么非主键索引结构叶子节点存储的是主键值(一致性和节省存储空间)
- 如果创建时未指定主键,系统会根据每一列可唯一区分的属性作为主键值,如果还是没有,则innodb会默认创建一个id作为主键(索引),且自增主键更容易维护B+树。
- 多个索引有多个B+树,但是非主键索引叶子节点不存储完整数据,只存储主键值,为了保持一致性和节省存储空间(如上3)
- .frm文件存储表结构(表的字段,类型等)
- .ibd文件存储索引和真正的数据
注:聚集索引解释:就是把索引和数据相结合在叶子节点上,将索引和数据结合在一个文件,在最后读取数据时减少一次IO提高效率
视频地址:https://www.bilibili.com/video/av73372462