mysql的索引底层数据结构

发布时间 2023-07-06 00:42:42作者: Aaron-cell

 

mysql索引数据结构

B+Tree数据结构

 

  • 索引是帮助mysql更好获取数据的一种排好序的数据结构
  • 传统B-Tree数据结构

  

  1. 叶节点具有相同的深度,叶节点的指针为空
  2. 所有索引元素不重复
  3. 节点中的数据索引从左到右递增排列
  • mysql优化后的B+Tree数据(B-Tree变种)

   

  1. 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  2. 叶子节点包含所有索引字段
  3. 叶子节点用指针连接,提高区间访问的性能
  • B+Tree对比B-Tree优势
  1. 将数据挂载到叶子节点中,意味着系统一次I/O可以将更多的第一、二层节点加载到内存中去,查找的效率更高。
  2. 叶子节点间使用指针连接,提高了区间查找的效率

 hash结构

   

  1.  对索引的key进行一次hash计算就可以定位出数据存储的位置
  2. 很多时候Hash索引要比B+ 树索引更高效
  3. 仅能满足 “=”,“IN”,不支持范围查询
  4. hash冲突问题

MyISAM存储引擎和InnoDB存储引擎索引实现区别

MyISAM存储引擎索引实现

  • MyISAM索引文件叶子节点存放的是数据的地址(主键索引和二级索引一样)

  

InnoDB存储引擎索引实现

  • 主键索引和二级索引不同

  

  1. 表数据文件本身就是按B+Tree组织的一个主键索引结构文件
  2. 聚集索引-叶节点包含了完整的数据记录
  3. 为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?

    1)InnoDB表在没有主键的情况下会自动选择一个全局唯一的字段做主键索引,如果表中不存在唯一字段则自动创建一个隐藏字段做主键;所以需要用户手动创建主键,避免mysql浪费性能做这个事情。

     2)首先使用整型字段查找时更方便比较,其次作为节点整型比其他类型占用空间更小,在一次I/O中可读取更多节点

     3)自增主键是因为索引中每层节点都是有序的,每次插入数据更有利于mysql进行索引排序

    4.为什么非主键索引结构叶子节点存储的是主键值?

    1)插入删除时方便保持数据一致性

    2)节省存储空间

  •  联合索引

注意事项

  • 主键索引又叫聚集索引,二级索引又叫非聚集索引
  • 多个字段组成的索引叫联合索引,是二级索引的一种;包括唯一索引也是二级索引的一种

存储引擎文件格式

  • 数据文件格式(MyISAM和InnoDB相同):“.frm”为后缀的文件,用于存储表的结构定义。这些文件包含了表的列名、数据类型、索引信息等。在创建表时,MySQL会自动生成这些文件
  • MyISAM存储引擎:以“.MYD”和“.MYI”为后缀的文件,用于存储表数据和索引数据
  • InnoDB存储引擎:以“.ibd”为后缀的文件,用于存储表数据和索引数据。