mysql索引数据结构

  1. 索引是帮助mysql高效获取数据的排好序的数据结构
  2. B+Tree(B-Tree)
    • 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
    • 叶子节点包含所有索引字段
    • 叶子节点用指针连接(双向)-便于范围查找,提高取件访问的性能
      image
  1. MYISAM索引文件和数据文件是分离的(非聚集),一个表包含MYD(数据),MYI(索引),frm(表结构)三个文件
    1. 判断where后的条件是否是索引字段,否则全表扫描
    2. 是索引字段,在MYI文件索引的根目录下查找目标值,获取该条数据的磁盘文件地址
    3. 根据地址在MYD文件获取该数据

 

image

  1. InnoDB索引实现(聚焦)
    • 表数据文件本身就是按B+Tree组织的一个索引文件

image.png

    • 聚集索引-叶节点包含了完整的数据记录,非聚集索引-叶节点包含了数据的地址

InnoDB是聚集索引,MYISAM是非聚集索引,聚集索引相比非聚集索引查询效率要高一些

    • 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?

如果没有建立主键,mysql会对数据表的列从左到右进行查找,找到符合唯一索引的列作为主键处理,如果没有这样的列,mysql会新增一个隐藏列;使用整型的自增主键比较大小更快,且占用的存储空间更小(如uuid,字符串比较大小更复杂,且占用的存储空间更大)

    • 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

截屏2020-10-12 下午6.53.05.png

非主键索引先根据索引列找到主键值,再根据主键值扫描主键索引树,一共扫描两棵索引树

    • 联合主键索引数据结构

截屏2020-10-12 下午7.02.08.png

首先比较第一列索引的值,如第一列的值相同,再比较第二类索引的值,以此类推

 

  1. Hash索引实现
    • 首先将索引的值作hash运算得到散列值,根据散列值可以直接获取存储此条记录的磁盘文件指针,此方法效率很高,但致命缺点是无法实现范围查找

截屏2020-10-12 下午7.12.08.png