mysql 索引
Laiyong Wang Lv5

常用数据结构

B树
B+树(本文说这个)
参考这篇文章:http://laiyong.wang/2022/11/11/tree

前置知识

  1. 索引页
  2. 双向链表
  3. 二分查找

自己去查啥意思,不科普了

原理

  • 主键索引
    一个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都不想用

索引失效

  1. like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效
    为什么?
    因为数据保存在最底层都是二进制,按照左前缀匹配’aa%’可以索引

  2. or语句前后没有同时使用索引

  3. 组合索引,不是使用第一列索引,索引失效
    引申个问题,为啥要创建组合索引,多创建几个单列索引不就不用关注顺序了么
    参考 原理-非主键索引,应该是索引多,需要创建的B+树会很多,没意思吧

  4. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
    据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描
    隐式转换name = ‘111’会使用到 name = 111 不会使用到
    因为当name值为111a 111q 111sxzcs都会跟111匹配

  5. 在索引字段上使用not,<>,!=

  6. 对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))

  7. 全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效
    关联回表-引申问题

  8. is null 和not is null 也会失效

 Comments