B树和B+树
- 二叉查找树
性质:左子树的键值小于根节点的键值,右子树的键值大于根节点的键值。
由于深度的不同,查找的效率也各不相同,若想查找的效率尽可能的高,需要这棵树是平衡的,从而引出了新的定义——平衡二叉树,也叫AVL树。
2、平衡二叉树(AVL 树)
性质:符合二叉查找树的条件下,任何节点的两个子树的高度最大差不能超过一。
如果在AVL树中进行插入或者删除节点,可能会导致AVL树失去平衡,这种失去平衡的二叉树可以概括为四种姿态:LL,LR,RL,RR。
AVL树在市区平衡之后,可以通过旋转的方式使其恢复平衡。
3、平衡多路查找树(B-Tree)
AVL树是为磁盘等外部存储设备设计的。
系统从磁盘中读取数据是以磁盘块为基本单位,位于同一个磁盘块中的数据会被一次性读取出来,一个磁盘块大约是4KB,而我们的InnoDB存储引擎中最小的管理单位是页,一页默认大小是16KB,可以通过innodb_page_size参数修改页的大小。
4、B+树
B+树是在B树上进行了优化,使其更适合进行外部存储。
B+Tree相对于B-Tree有几点不同:
非叶子节点只存储键值信息。
所有叶子节点之间都有一个链指针。
数据记录都存放在叶子节点中。
B+树的高度一般都在2~4层,且mysql的Innodb存储引擎在设计时是将根节点常驻内存中的,也就是说查找某一个键值的行记录只需要1~3次IO操作。
数据库中的B+Tree索引可以分为聚集索引(clustered index)和辅助索引(secondary index)。上面的B+Tree示例图在数据库中的实现即为聚集索引,聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。