![](/images/WechatIMG143.jpeg)
常用数据结构
B树
B+树(本文说这个)
参考这篇文章:http://laiyong.wang/2022/11/11/tree
前置知识
- 索引页
- 双向链表
- 二分查找
自己去查啥意思,不科普了
原理
- 主键索引
一个B+树
将其拆分,索引页组成的主键目录可以看作二叉树(类似但不是)
先查询索引页,确定数据在具体那片数据页上
再在数据页上进行二分查找,确定最终数据(可能有也可能没有)
非主键索引
每个索引都是一颗B+树,单字段就不说了,太垃圾
组合索引
例如A,B,C,D
其页子节点保存的就是A,B,C,D,主键id
其保存顺序就是按照A排序,一样再按照B排序,B也一样按照C排序,C也一样按照D排序,D也一样按照id排序,已这种情况最终生成一颗B+树引申个问题
都是字符串,你他妈咋排序,
查询了下,应该所有数据的保存,最终都是二进制,所以,可以排序
回表
- 定义
根据非主键索引查询到的结果并没有查找的字段值,此时就需要再次根据主键从聚簇索引的根节点开始查找,这样再次查找到的记录才是完成的
人话就是先查主键,再由主键定位数据 - 举个例子
由本文的原理-非主键索引-组合索引来看
正常我们都会按照索引来进行查询,当查询的是A,B,C,D,id时,这些数据都在页子节点中,那就不需要回表,直接返回
当查询的数据有E时,则需要先获取id,再由id定位行数据,取出E - 能引申出个问题
那就是全表查询比回表还快的时候,就算使用了索引,mysql都不想用
索引失效(这东西,好像只能死记)
like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效
为什么?
因为数据保存在最底层都是二进制,按照左前缀匹配’aa%’可以索引or语句前后没有同时使用索引
组合索引,不是使用第一列索引,索引失效
引申个问题,为啥要创建组合索引,多创建几个单列索引不就不用关注顺序了么
参考 原理-非主键索引,应该是索引多,需要创建的B+树会很多,没意思吧如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描
隐式转换name = ‘111’会使用到 name = 111 不会使用到
因为当name值为111a 111q 111sxzcs都会跟111匹配在索引字段上使用not,<>,!=
对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))
全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效
关联回表-引申问题is null 和not is null 也会失效