MySql索引B+Tree数据结构原理解析

索引的本质

	索引是帮助MySql高效获取数据的一种"排好序"的"数据结构"

MySql采用的是B+Tree数据结构,B+Tree数据结构在每一个节点存储多个值,非叶子节点只存储索引,不存储data,在叶子节点存储的是索引和完整的data元素(备注:InnoDB)。
MySql索引B+Tree数据结构原理解析_第1张图片
根节点是存储在内存中,所以查询速度更快,但是正因为在内存中,所以不能存入太大量的所以,不然会占用大量内存,innodb引擎,默认根节点的大小为16k
MySql索引B+Tree数据结构原理解析_第2张图片
如果主键采用bigint类型,一个bigint类型占8个字节,在节点上,索引和索引之间空白的地方存储"磁盘文件指针",大约6个字节,计算可得一个节点默认情况下大约可以存储1170个索引,根节点的子节点也一样,只存储索引和磁盘文件指针,叶子节点存储索引和具体的data,如果把叶子节点的data和索引一共算做1KB的情况下,根据第一张图可知,我们根据索引只需进行2次磁盘io就可以在一张1170117016大约2190万条数据的表中查询到数据,如果没有索引就需要全表查询,这将会非常耗费时间。
MySql索引B+Tree数据结构原理解析_第3张图片
1、InnoDB在磁盘中将数据内容按B+Tree组成的一个索引结构的文件。
2、InnoDB采用的是"聚集索引",也就是叶子节点包含了索引值和完整的数据,而MyISAM引擎采用的非聚集索引,在磁盘中索引单独形成一个文件,表数据单独形成另一个文件,B+Tree的叶子节点存储的是索引和索引对数据的磁盘指针,然后再根据指针找到具体的数据。
3、B+Tree数据结构必须要有一个主键索引,如果未创建主键索引,mysql会自动设置一个类似于rowid的主键索引。推荐使用整型的自增主键,因为字符串或者其他类型进行索引查询时,不方便进行比较大小。B+Tree的叶子节点包含所有的data,而且是从左到右依次递增,如果主键设置为递增,则新插入的数据就会一直用右边添加,不会改变左边的结构,如果索引不自增,大小可变,新增数据时可能就会改变原有的树结构从而影响性能。
MySql索引B+Tree数据结构原理解析_第4张图片
4、B+Tree数据结构的叶子节点是从左到右依次递增,在叶子节点会有一个磁盘指针指向下一个叶子节点的位置,这样设计是因为如果我们进行范围查找,比如:select column from table where number > 18,首先根据条件定位到具体的索引,然后往右就都是满足条件的数据,就可以直接根据叶子结点上存储的磁盘指针获取其他数据,而不是每一条数据都需要再从根节点重新查询一遍。

此文只针对Innodb引擎,并且是单个字段的主键索引,谢谢观看。

你可能感兴趣的:(Mysql)