我们mysql底层的索引存储数据结构是按照B+树方式来存储的,也是从B树结构演变而来。

我们知道索引就是类似我们的书本的目录页,存储要找的内容所在的页数。

MySQL索引背后的数据结构和算法原理 mysql索引的数据结构有哪些_MySQL索引背后的数据结构和算法原理


B树的结构:

叶节点具有相同的深度,叶节点的指针为空

所有索引元素不重复

节点中的数据索引从左到右递增排列

MySQL索引背后的数据结构和算法原理 mysql索引的数据结构有哪些_文件地址_02

B+树的结构:

非叶子节点不存储data,只存储索引(冗余),可以放更多的索引

叶子节点包含所有索引字段

叶子节点用指针连接,提高区间访问的性能

MySQL索引背后的数据结构和算法原理 mysql索引的数据结构有哪些_文件地址_03

另一个点就是说,我们的数据存储在磁盘文件不一定连续的,可能是分散的存在不连续的文件地址。因此B+树的做法是在磁盘上划分一块小的空间存放很多的索引,这个叫索引页也叫非叶子节点,默认大小为16kb,结构是索引和下一个索引页的文件地址,比如我们建索引的字段类型为bigint8个字节,文件地址占6个字节,那么这个索引页可以存储16kb/14b=1170个索引,假设我们叶子节点存储的一个索引的数据大小为1kb(所有字段大小),那么每个叶子节点可以存16个索引的数据,假设树的高度为2,那么可以存储的记录数就是1170x1170x16=2千万条数据左右,而且只需要做2次磁盘oi即可找到对应的数据。如果我们用
B树存储2千万数据,索引树的高度会是多少呢?

B树的数据是和索引存放在节点上面的,那么2千万的数据,需要树的高度至少大于6,要做6次磁盘io,而且读取文件到内存也占用空间比较大。

我们都知道建表的时候都要设置一下表的存储引擎,一般常选择有InnoDB和MyIsam存储引擎,这两者有什么区别:

1,文件存储结构:
MyISAM索引文件和数据文件是分离的(非聚集),索引也是按照按B+Tree组织的一个索引结构文件,但是表数据不是,叶子节点不包含数据记录,只记录了行数据所在的磁盘文件地址。
InnoDB 表数据文件本身就是按B+Tree组织的一个索引结构文件,是一种聚集索引-叶节点包含了完整的数据记录。

MyISAM:

文件分别对应的是表结构、表数据、索引数据

MySQL索引背后的数据结构和算法原理 mysql索引的数据结构有哪些_文件地址_04


InnoDB :

文件分别表示:表结构,表索引和表数据

MySQL索引背后的数据结构和算法原理 mysql索引的数据结构有哪些_子节点_05

2,事物
InnoDB支持事物,而MyISAM不支持,就没有了事物的四个特征ACID。