mysql 索引详解
一、索引结构
二叉排序树 与 平衡二叉树
二叉排序树结构可以有效的减少查询时间,最优可以实现二分查找,每次查询只需要查询一半数据。但如果本身是有序数据,则二叉排序树就失去了效果,因此产生平衡二叉树
平衡二叉树,是在二叉排序树的结构上保证左右子树高度差不超过 1 ,有效的减少查询次数
b 树,也叫 m 阶树,每个节点最多 m 个子树,数据存储在节点上
b+ 树,是 b 树进阶,在 b 树的基础上,将所有的数据存储在叶子节点上,且叶子节点根据关键字从小到大相连
mysql 数据库 innodb 采用的是 b+ 树作为索引结构,此外增加了相邻叶子节点访问的指针,提高区间访问速度
二、使用 B+ 树
索引本身是存储在磁盘上,需要将索引加载到内存才能进行处理,因此数据越小能够加载的索引数据越多,可以有效的减少 io 次数。
mysql 存储引擎 myisam 采用的是非聚簇索引, innodb 采用的是聚簇索引
- myisam 数据域是记录的地址
- innodb 必须有一个主键,主键采用聚簇索引,数据域是完整的记录,辅助索引的数据域是主键值,因此辅助索引需要二次查询
MyISAM索引实现
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:
在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:
InnoDB索引实现
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。
这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,
如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域
参考:https://www.cnblogs.com/boothsun/p/8970952.html
树模拟:https://www.cs.usfca.edu/~galles/visualization/RedBlack.htm