索引的本质
- 索引是帮助mysql高效获取数据的排好序的数据结构
- 索引存储在文件里
- 索引结构
- 二叉树(红黑树:二叉平衡树)
- hash
- BTREE
B-Tree与B+Tree
- B+Tree是B-Tree的变种
- B-Tree
- 度-节点的数据存储个数
- 叶节点具有相同的深度
- 叶节点的指针为空
- 节点中的数据key从左到由递增排列
- 叶子节点存储data
- B+Tree
- 非叶子节点不存储data,只有存储key,可以增大度
- 叶子节点不存储指针
- 顺序访问指针,提高区间访问的性能
InnoDB存储引擎
- InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键
- 锁的颗粒度:行锁
- 支持索引
MyISAM存储引擎
- 不支持事务操作
- 不支持外键
- 支持索引
- 锁的颗粒度:表锁(限制了读/写工作负载的性能)
- 因此它通常用于 Web 和数据仓库配置中的只读或以读取为主的工作负载
MyISAM 索引实现
- MyISAM索引文件和数据文件是分离的
- 先在B+Tree索引文件中查找数据指针,再根据数据指针到数据文件中查找数据
InnoDB 索引实现
- InnoDB索引和数据是存储在一起的
- 表数据文件本身就是按B+Tree组织的一个索引结构文件
为什么不用二叉树
- 索引结构如果使用二叉树,二叉树存储数据深度会越来越深,最终还是会遇到性能瓶颈
// 不是平衡二叉树
// 1
// \
// 2
// \
// 3
// \
// 4
// \
// 5
// 不是完全二叉树,但是平衡二叉树
// 1
// / \
// 2 3
// /\ \
// 4 5 6
// /
// 7