mysql索引数据结构
B+Tree数据结构
- 索引是帮助mysql更好获取数据的一种排好序的数据结构
- 传统B-Tree数据结构
- 叶节点具有相同的深度,叶节点的指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排列
- mysql优化后的B+Tree数据(B-Tree变种)
- 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问的性能
- B+Tree对比B-Tree优势
- 将数据挂载到叶子节点中,意味着系统一次I/O可以将更多的第一、二层节点加载到内存中去,查找的效率更高。
- 叶子节点间使用指针连接,提高了区间查找的效率
hash结构
- 对索引的key进行一次hash计算就可以定位出数据存储的位置
- 很多时候Hash索引要比B+ 树索引更高效
- 仅能满足 “=”,“IN”,不支持范围查询
- hash冲突问题
MyISAM存储引擎和InnoDB存储引擎索引实现区别
MyISAM存储引擎索引实现
- MyISAM索引文件叶子节点存放的是数据的地址(主键索引和二级索引一样)
InnoDB存储引擎索引实现
- 主键索引和二级索引不同
- 表数据文件本身就是按B+Tree组织的一个主键索引结构文件
- 聚集索引-叶节点包含了完整的数据记录
- 为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
1)InnoDB表在没有主键的情况下会自动选择一个全局唯一的字段做主键索引,如果表中不存在唯一字段则自动创建一个隐藏字段做主键;所以需要用户手动创建主键,避免mysql浪费性能做这个事情。
2)首先使用整型字段查找时更方便比较,其次作为节点整型比其他类型占用空间更小,在一次I/O中可读取更多节点
3)自增主键是因为索引中每层节点都是有序的,每次插入数据更有利于mysql进行索引排序
4.为什么非主键索引结构叶子节点存储的是主键值?
1)插入删除时方便保持数据一致性
2)节省存储空间
- 联合索引
注意事项
- 主键索引又叫聚集索引,二级索引又叫非聚集索引
- 多个字段组成的索引叫联合索引,是二级索引的一种;包括唯一索引也是二级索引的一种
存储引擎文件格式
- 数据文件格式(MyISAM和InnoDB相同):“.frm”为后缀的文件,用于存储表的结构定义。这些文件包含了表的列名、数据类型、索引信息等。在创建表时,MySQL会自动生成这些文件
- MyISAM存储引擎:以“.MYD”和“.MYI”为后缀的文件,用于存储表数据和索引数据
- InnoDB存储引擎:以“.ibd”为后缀的文件,用于存储表数据和索引数据。