MySQL索引笔记(索引的底层原理)

MySQL索引笔记(索引的底层原理)

索引是帮助MySQL高效获取数据的排好序的数据结构

索引数据结构

  1. 二叉树;
  2. 红黑树;
  3. Hash表;
  4. 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.为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
解答:主键索引在维护数据时,可以减少索引数据的复杂度,节约存储空间,在字段比较比较复杂是可以建立二级索引

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿卿@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值