索引

  • 将数据按字段值排好序存储,查找时可以根据排好序的数据快速定位到数据

    索引的数据结构

  • 红黑树

  • 二叉树
  • B树,B+树
  • Hash

    B树(B-树)

  • 叶子节点和非叶子节点都存储数据

  • 索引数据不重复,每个节点(默认16KB)存储索引和数据,所以每个节点存储的数据比较少,节点就会增多,B树的深度就会比较大,查找数据时磁盘IO就比较多
  • 节点数据索引从左到右依次递增

    B+树(B树变种)

  • 只有叶子节点存储数据,非叶子节点只存储索引,深度比B树浅

  • 有索引冗余,叶子节点包含所有索引

    Hash结构

  • 对索引值进行hash计算,通过hash值计算出数据存储位置

  • hash结构只满足 “=”,“in”等搜索条件,不满足范围查询

    索引类型

  • 主键索引,根据主键自增值建立的索引结构

  • 联合索引:在多个字段上建立索引,在第一个字段排好序的情况下对第二字段排序在对后面字段排序
  • 聚簇索引:所有数据都在叶子节点
  • 非聚簇索引:叶子节点只有索引值,需要进行回表才能查找出完整数据1

    MySql常用存储引擎

  • MyIsam:使用的是非聚簇索引,通过找到索引值再回表找到数据具体位置再读取出来,表数据生成的文件是两个文件,一个索引文件,一个数据文件,5.7版本表有三个文件,索引文件,数据文件,表信息文件

  • InnoDb:使用的是聚簇索引,表数据按照B+树进行存储,根据索引树可以直接找到数据存储位置,5.7版本有两个文件,表数据文件和表信息文件,8.0只有一个文件了

    最左前缀

  • 在联合索引中,只有左边字段值排好序的情况下,右边字段才是有序的,使用联合索引时只能按顺序来,不能跳过,否则找的数据就有问题

    索引下推

  • 使用第一个索引字段使用 like 这种范围查找出来的数据会再根据后面字段过滤一下,这样会减少回表次数