前序:?
索引有多种类型,其中包括主键索引、唯一索引、B+Tree索引(聚集索引和非聚集索引)、哈希索引等等,下面主要深入了解一下B+Tree索引和聚集索引。
?
B+Tree介绍
MySQL是由B+Tree构成的,下面先来介绍一下什么是B+Tree。
?
①B+Tree是为磁盘或者其他直接存取辅助设备而设计的一种平衡二叉树。(这句话怎么理解?)
答:数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B+Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。
?
②B+Tree的节点都是按照键值的大小顺序存放的,叶节点之间也通过指针连接起来,为了提高取数据时的效率。
?
具体结构如下图:
?
?
B+Tree索引
B+Tree索引包含了聚集索引和非聚集索引。
?
①InnoDB
?
聚集索引:
聚集索引就是按照每张表的主键构造一颗B+Tree,并且叶子节点就是存放的是整张表的行记录数据的数据页,每个数据页之间也通过双向链表进行连接。
?
? ? ? ??
?
非聚集索引:
非聚集索引与聚集索引唯一的不同就是非聚集索引叶子节点存放的data是对应的数据聚集索引的key,所以每当访问非聚集索引的数据,其实是走了两个步骤,首先找到聚集索引的key,再通过聚集索引的key找到对应的数据信息。
?
?
?
②MyISAM
聚集索引和非聚集索引的数据表结构差别不大。叶子节点都存放的是指向数据行信息的指针数据。
?
?
参考文献:《MySQL技术内幕InnoDB存储引擎》