数据库培训后的总结
数据结构
上图中分别出现了BST、AVL、B-Tree、B+Tree,其中BST和AVL都很熟悉。
B-Tree: 平衡多路搜索树,是一种多路的搜索树,每个节点存储M/2到M个关键字,非叶子节点存储只想关键字范围的子节点,而且只出现一次,非叶子节点可以命中
B+Tree: 在B—Tree的基础上,所有的关键字都在叶子节点中出现,非叶子节点作为叶子节点的索引,B+tree总是到叶子节点才命中
B*Tree: 在B+Tree的基础上,非叶子节点也增加链表指针,如下图在B+Tree的图上给非叶子节点增加了链表指针。
因为磁盘的io是以磁盘块为基本单位的,所以B+tree索引多用于基于磁盘的数据库系统,数据持久化在磁盘上,每个叶子节点包含较多的记录,具有较高的扇出,索引高度比较小,一般在3-4层,树的高度决定磁盘的io次数,从而影响数据库的整体性能;为什么不使用B-tree作为数据库索引呢,B-tree和B+tree最大的不同是,B-tree的内部节点包含了数据,每一个磁盘块中包含的节点数量会被减少。
索引的类型
-
cluster index(聚簇索引)
簇是系统读写磁盘的单位,由于数据存放在磁盘的各个簇中,这些簇的根本组织方式是存储引擎(innodb)在这些簇中存放B+tree结构从而组织起来的,这些B+tree结构同时也作为主键的索引,所以这种索引称之为聚簇索引;因为它存在簇中, 聚簇索引一张表中只存在一个,同时找到了该索引的位置的同时就几乎找到数据了。
-
secondary index(辅助索引)
除了聚簇索引之外的索引,都称为辅助索引,辅助索引不和数据放在一起,索引的每个节点包含了辅助索引列的键值和对应列的聚簇索引的键值,通过该聚簇索引的键值,再进行一次聚簇索引的B+tree查找,最终找到该数据,如下图所示,是需要二次回表的,所以速度会比较慢:
covering index(覆盖索引)
查询的时候会频繁的对特定的列进行查询而不需要查询全部,覆盖索引中保存了特定列的值而不是全部,这就实现了无需二次回表的高效查询
prefix index(前缀索引)
对于一些varchar类型的字段,长度会很长,在上面创建索引的时候可以只根据其前面的几位字符创建索引,这种索引称之为前缀索引
Adaptive Hash Index(自适应哈希索引)
innoDB存储引擎会监控对表上缩影的查找,如果观察到建立哈希缩影可以带来速度的提升,则建立哈希索引,所以称之为自适应的。自适应哈希索引通过缓冲池的B+tree构造而来,因此建立的速度很快,而且不需要将整个表都建立哈希缩影,InnoDB存储引擎会自动根据访问的瓶铝和模式未来为默写页面建立哈希索引。