一:引入

1.索引是什么?

索引是一种数据结构;

索引是一种排好序的数据结构

2.索引的目的是什么?

帮助用户高效快速查询到业务所需的数据

综上所诉,因此在大数据量的一个表中,什么样的一种排好序的数据结构能够达到我们的目的

二:B-Tree数据结构

1.特点

A-所有的叶子节点具有相同的深度,叶子节点的指针为空

B-所有的索引元素不重复

C-节点中数据是按照从左到右递增排列

mysql readview的数据结构 mysql数据结构原理_MySQL

三:B+Tree数据结构,是B-Tree的变种

1. 特点:

A-非叶子节点,不存储数据,只存储索引(冗余),可以存储更多的索引

B-叶子节点包含所有的索引项,主键索引data会包含所有数据,非主键索引,data只会包含主键

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

mysql readview的数据结构 mysql数据结构原理_B+Tree_02

B+Tree叶子节点为什么添加双向指针连接各个叶子节点,因为查询数据的时候,需要查询根据某个范围查询数据,

比如,大于某个值,小于某个值,在M和N之间的数据等。

索引是如何支持千万级的快速查找的?

首先索引的结构是B+Tree的结构,又因为MySQL每个节点的大小是16kb,非叶子节点存储的只是索引数据,

索引字段是自增的整形类型的数据,占据的空间大小为约8b,指向下一层节点的指针占据的空间大小约6b,因此一个

根节点存储的索引数据的个数约为:

                                    16*1024 /(8+6) 约等于 1170

二层节点可以存储的索引数量大约为:

                                     1170 * 1170 = 1368900(百万级别)

因为非叶子节点只存储索引数据,因此百万级别的数据只需进行3次磁盘IO,就可查询到所需数据

四:MySQL的索引结构使用的就是B+Tree的数据结构

1.MyISAM存储引擎

索引文件和数据文件是分开存储的,非聚集索引

主键索引的叶子节点存储的是数据文件中的引用地址

2.InnoDB存储引擎 

表数据文件本身就是按照B+Tree数据结构组织起来的一种索引文件

索引文件和数据文件是不分离的,聚集索引

主键索引的叶子节点存储的是完整的数据

非主键索引文件的叶子节点存储的是主键值

 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?

因为InnoDB存储引擎的表数据文件,使用的是聚集索引,就是索引文件和数据文件存储在一起,

而且,InnoDB存储引擎的表数据存储方式都是使用的主键索引把数据组织在一起存储的。使用自增的原因

是新增的数据直接添加到后续节点中即可。

为什么非主键索引结构叶子节点存储的是主键值?

为了数据的一致性,存储数据的时候,只需保证主键索引存储成功即可,而无需等待非主键索引数据

存储成功,才能提交数据;还有节省存储空间,如果非主键索引也存储数据,那么有几个索引则数据就会存储

几份,这样造成空间的浪费和数据冗余。

五:索引的最左前缀原则(针对联合索引)

比如,联合索引的字段为 (code,name,birthdate),那么索引的结构是先按照code的顺序,向B+Tree结构

添加数据,然后,如果code的值相同再按照name的顺序向B+Tree结构添加数据,最后如果code和name的值相

同再根据birthdate的顺序向B+Tree结构添加数据。

换一种理解方式:把 code + name + birthdate 拼接起来,当成一个字符传理解联合索引,这样和单列索引

就一样了。

mysql readview的数据结构 mysql数据结构原理_主键_03