MySQL为何不选择平衡二叉树
既然平衡二叉树解决了普通二叉树的问题,那么mysql为何不选择平衡二叉树作为索引呢?
索引需要存储什么
让我们想一想,如果我们要把索引存起来,那么应该存哪些信息呢,它应该存储三块信息:
-
索引的值:就是表里面索引列对应的值。
-
数据的磁盘地址(通过磁盘地址找到当前数据)或者直接存储整条数据。
-
子节点的引用:我们需要从根节点往下走,所以需要知道左右子节点的地址。 根据这三点,可以有如下大致的一个简单的结构图:
上图中数字表示的是索引的值,0x开头的表示磁盘地址,根节点中存了左右节点的引用。
AVL树用来存储索引存在什么问题
我们知道,页(Page)是 Innodb 存储引擎用于管理数据的最小磁盘单位,页的默认大小为16KB。页也就是上图中的节点,每查询一次节点就需要进行一次IO操作,IO操作是一种非常耗时的操作,很多业务系统的瓶颈都是卡在IO操作上,所以如果我们需要提高查询效率的办法之一就是减少IO次数,那么问题就来了,AVL树一个节点上只存了一个关键字(索引值)+一个磁盘地址+左右节点的引用,这是远远达不到16KB的,会浪费了大量的空间。
上图中如果我们要找到6这条数据,需要进行3次IO(获取一个节点