MySQL进阶 - 索引结构设计

问题的引出

  1. 为什么要设计索引?
    • 加快数据的访问效率,可以直接根据 值 ————> 数据
  2. 如何设计索引?
    • 数据的存储载体在磁盘里,即根据key值找到存储的文件,再通过偏移完成数据的查找
    • 1.关键值:key
    • 2.文件名称
    • 3.偏移量 offset
  3. 设计索引的时候使用什么数据结构?
    • hash索引,B树,B+树
  4. MySql是如何实现的?
    • B+树索引+hash索引

hash索引:

优点是直接根据key找到对应的value;
缺点:hash存储需要将所有数据文件存储在内存;
	 等值查询速度快,范围查询的话,需要多次查找
	 哈希冲突
二叉树和红黑树的索引格式:
都会因为树的深度造成IO次数变多,从而影响效率
1
2
3
4
5
6

B树的索引格式:

每一个节点存储三个数据,关键码,指向子树的指针和关键码个数;
B树的每一个节点都既包含索引,又包含数据
从而导致按照磁盘页(4K*N)读取数据的时候,存储的内容变少。
1
2
3

B+树的索引格式:

B+树当中,只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联。
所以同样大小的磁盘页可以容纳更多的节点元素。这意味着,数据量相同的情况下,
B+树的结构比B-树更加矮胖,因此查询时IO次数也更少。
因此MySql选择B+树的索引格式。
1
2
3
4

在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。

  • InnoDB B+树索引
  • MyISAM B+树索引
  • MEMORY hash索引