B站讲解视频:https://b23.tv/SC2FfH
数据结构演示网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
什么是索引
- 索引是帮助MySQL高效获取数据的排好序的数据结构
索引的目的
- 索引数据结构的目的,就是用更少的查询次数获得数据,表现到树的结构上就是尽可能的减小树的高度。
索引的数据结构
- 二叉树
- 二叉树会出现变成链表的特殊情况
- 红黑树(二叉平衡树)
- 红黑树能避免出现链表化的情况,jdk1.8 hashmap链表长度大于8时转为红黑树,提升了代码效率。
- 但是,红黑树在数据量过于庞大的时候并不能有效降低树的高度。
- Hash表
- 索引值hash之后存储到映射表中一一对应
- 但是范围查找的情况下hash索引无法应对
- B-Tree
- 在红黑树的基础上引入多叉平衡树,每一个节点都存储索引和对应的数据
- 但是在范围查找的时候同样需要消耗很多资源
- B+Tree(多叉平衡树)
- 非叶子结点不存储data(16K),只存储索引(冗余),可以方更多的索引
- 叶子结点包含所有索引字段
- 叶子结点用指针连接,提高区间访问能力(范围查找)
- 一个索引有14B(8B+6B),一个节点最多有16KB,能存储1170个索引
两大存储引擎
- 数据库中的存储引擎是用于表的
- MyISAM索引文件和数据文件是分离的
- InnoDB的索引文件和数据文件是聚合的
- 什么是聚集索引:就是叶子结点包含了完整的数据记录
- 什么是非聚集索引:叶子结点不包含数据记录
- 为什么InnoDB表必须有主键,并且推荐使用整形自增主键:不推荐使用UUID,UUID使用的是长传的字符串,在查询的时候需要多次的对比大小,这时候使用UUID效率太低。UUID占用的空间比较大,所以推荐使用整形。因为考虑到B+树叶子结点总是顺序存放的,如果使用UUID就会导致顺序不确定,在插入的时候造成树的重新平衡会造成额外的性能开销