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

posted @ 2018-12-13 20:09  byebai95  阅读(188)  评论(0编辑  收藏  举报