MySQL进阶 - 索引结构设计
问题的引出
- 为什么要设计索引?
- 加快数据的访问效率,可以直接根据 值 ————> 数据
- 如何设计索引?
- 数据的存储载体在磁盘里,即根据key值找到存储的文件,再通过偏移完成数据的查找
- 1.关键值:key
- 2.文件名称
- 3.偏移量 offset
- 设计索引的时候使用什么数据结构?
- hash索引,B树,B+树
- MySql是如何实现的?
- B+树索引+hash索引
hash索引:
优点是直接根据key找到对应的value;
缺点:hash存储需要将所有数据文件存储在内存;
等值查询速度快,范围查询的话,需要多次查找
哈希冲突
二叉树和红黑树的索引格式:
都会因为树的深度造成IO次数变多,从而影响效率
1
2
3
4
5
6
2
3
4
5
6
B树的索引格式:
每一个节点存储三个数据,关键码,指向子树的指针和关键码个数;
B树的每一个节点都既包含索引,又包含数据
从而导致按照磁盘页(4K*N)读取数据的时候,存储的内容变少。
1
2
3
2
3
B+树的索引格式:
B+树当中,只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联。
所以同样大小的磁盘页可以容纳更多的节点元素。这意味着,数据量相同的情况下,
B+树的结构比B-树更加矮胖,因此查询时IO次数也更少。
因此MySql选择B+树的索引格式。
1
2
3
4
2
3
4
在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。
- InnoDB B+树索引
- MyISAM B+树索引
- MEMORY hash索引