本质
索引是Mysql高效获取数据的排好序的数据结构
索引数据结构
Mysql的索引数据结构主要有B+Tree、Hash表两种
B-Tree特点
- 叶节点具有相同的深度,叶节点的指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排序
B+Tree特点
- 非叶子节点不存储data,只存储索引,因此会导致数据冗余,但是可以放更多的索引
- 叶子节点包含所有的索引字段
- 叶子节点用指针连接,提高区间访问的性能
Hash表的特点
- 对索引的key进行一次hash计算就可以定位出数据存储的位置
- 很多时候Hash索引要比B+树更加搞笑
- 仅能满足"="、“IN”,不支持范围查询
- hash冲突问题
实现方式
MyISAM索引
文件和数据文件是分离的(非聚集)
InnoDB主键索引
数据和索引是在同一个文件(聚集)
- 表数据文件本身就是按B+Tree组织的一个索引结构文件
- 聚集索引-叶节点包含了完整的数据记录
InnoDB非主键索引
InnoDB非主键索引的叶子节点的data中,只存主键地址(聚集)
InnoDB联合(复合)索引
联合索引:就是一个索引由多个字段组成,需要满足最左前缀原则
注意事项
为什么InnoDB表建议必须建主键,并且推荐使用整形的自增主键?
InnoDB的表数据文件的构建本身就需要一个索引,如果有主键的话,Mysql就会根据主键来建索引构建文件,如果没有的话,Mysql就会从表中选择一列所有元素都不相等的列,如果没有找到的话,那么Mysql会帮你建立一个元素唯一的隐藏列,这将耗费Mysql的性能,因此需要建表的时候建主键。而使用整形主键便于比较大小,使用自增主键是因为如果不使用自增主键时,Mysql需要为维护B+Tree索引结构而需要执行相关的维护树结构的操作,而自增可以减少Mysql为维护树结构的操作
为什么非主键索引结构叶子节点存储的是主键值?
- 节省存储空间
- 更好的保持一致性:对于数据库的操作,只要维护好一级索引就可以实现一致性,减少操作的复杂度,如果二级索引存储的也是全部的值,那么需要在所有索引都维护好之后,才能实现一致性