索引的数据结构
B Tree
- 叶节点具有相同的深度,叶节点的指针为空;
- 所有索引元素不重复;
- 节点中的数据从左到右递增排列。
B+ Tree
- 非叶子节点是冗余索引,不存储数据,只存储索引,并且可以重复,因此可以放更多的索引;
- 叶子节点包含所有的索引字段;
- 叶子节点用指针连接,提高区间访问的性能。
B树和B+树的区别:
- B+树叶子节点有指针连接,方便范围查找,B树没有;
- B+树的非叶子节点是冗余索引,在相同高度的情况下比B树可以存储更多的索引,因此查询大量数据的性能更高。
Hash
- 对索引的key进行一次Hash计算就可以定位出数据存储的位置
- 很多时候Hash索引要比B+树索引更高效
- 仅能满足“=”、“IN”,不支持范围查询
- 存在Hash冲突问题,冲突时通过链表将数据存储到下一个内存地址
存储引擎
MyISAM存储引擎
- MyISAM是非聚集索引,索引文件和数据文件相分离
InnoDB存储引擎
- InnoDB是聚集索引,叶子节点包含了完整的数据记录
- InnoDB表必须建主键,并且推荐整型的自增主键
- 非主键索引结构叶子节点存储的是主键值,以便保持数据一致性和节省存储空间
索引最左前缀原理
联合索引的底层结构:
- sql中使用联合索引(name,age,position)时,必须依次查询name、age、position字段才会走索引。