MySQL索引笔记(索引的底层原理)
索引是帮助MySQL高效获取数据的排好序的数据结构
索引数据结构
- 二叉树;
- 红黑树;
- Hash表;
- B-Tree;
二叉树
红黑树(二叉平衡树)
数据结构网站(https://www.cs.usfca.edu/~galles/visualization/Algorithms.html)
红黑树在数据量大的时候没有优势(树的高度不可控)
B-Tree
1.叶节点具有相同的深度,叶节点的指针为空
2.所有索引元素不重复
3. 节点中的数据索引从左到右递增排列
4. 非叶子节点不存储data,只在叶子节点存储
5. 没有指针,在范围查找的时候没有指针定位,查询速度相应会慢
B+Tree(B-Tree变种)
1.非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
2.叶子节点包含所有索引字段
3.叶子节点用指针连接,提高区间访问的性能
4.节点中的数据从左到右依次递增排列(排好序)
5. 树的高度由非叶子节点存储的数据决定
6. B+Tree的指针: 在范围查找的时候可以快速定位符合条件的数据,MySQL底层的 指针是双箭头类型指针
7. 在维护数据的时候会自动排序
Hash表
1.对索引的key进行一次hash计算就可以定位出数据存储的位置
2.很多时候hash索引要比B+树索引更高效
3.仅能满足“=”,“IN” 不支持范围查询
4.hash冲突问题
5.理想情况下可能只需定位一次就可以定位到节点(hash运算速度快)
6.hash结构的限制:在查询范围的时候定位不了,还是需要全表扫描
InnoDB索引实现(聚集)
1…ibd文件:
2.表数据文件本身就是按B+Tree组织的一个索引结构文件
3.聚集索引-叶子节点包含了一个完整的数据记录
4.非聚集索引-索引和数据文件是分离存储的
5.就单纯索引角度来说聚集索引的查找速度要快,非聚集索引需要跨文件查找,速度相对会慢
6.在使用二级索引时要先查找到主键,再去查找聚簇索引
联合索引的底层存储结构(多个索引组成一个索引)
1.一般是不推荐建立多个单个索引,一般会使用联合索引实现单个索引
2.索引最左前缀原理:通过琢渐比较字段进行维护,在使用是需要按照建索引的顺序进行使用,不能跳过最左边的索引条件(多个字段的联合索引)
3.为什么要使用最左前缀原理:因为在数据存储中数据时按照顺序排序的,一旦跳过最左前缀就相当于数据不是排好序的,意味着在查询的时候需要全表查询
相关面试题
1.为什么建议InnoDB表必须建主键,而且推荐使用整形的自增主键?
解答:.iba在构建的时候必须用B+Tree存储,使用主键可以直接使用主键构建B+Tree,不使用主键在构建B+Tree时会去找表中字段中某例不存在相同数据的列进行构建,或者重新新增一个隐形的字段,用于构建B+Tree。整形的自增主键相对需要的内存要小,对节约硬盘的空间有很大的帮助。自增:在插入数据的时候只需往已有的数据之后插入,不会打乱已有的数据节点
2.为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
解答:主键索引在维护数据时,可以减少索引数据的复杂度,节约存储空间,在字段比较比较复杂是可以建立二级索引