MYSQL会为表内有建立的每一个索引建立一颗对应的B+树,B+树的每一个节点,包括叶子结点和非叶子结点都是一个数据页。如果索引是主键,那我们称索引为聚族索引,叶子结点存储表内的所有字段并根据主键值从小到大依次排序;如果索引是非主键,那我们称它为二级索引,叶子结点存储表内的索引字段和主键值并根据索引字段从小到大排序。既然叶子结点存储的是表字段数据,那非叶子结点存储的是不是和叶子结点存储的一样呢? 其实不然,我们需要考虑到一个问题。当我们使用索引也就是在B+树中查找数据时,我们唯一的查找方式就是依次遍历所有数据页中的所有数据,一个数据页分配的空间是16KB,当数据页的数量达到一定数量时遍历B+树和全表查询有什么区别呢,况且我们说每一个索引对应一颗B+树。全表遍历这明显看不出B+树引用给我们带来的作用。因此我们沿着MYSQL设计者们的步伐,我们用非叶子结点数据页存储一个叶子结点数据页中主键值最小的编号,如某一张叶子结点的数据页的主键编号为1~99,那我们把主键编号1和该数据页编号作为一条记录存在非叶子结点的数据页中,当我们在需要通过主键查询行记录时,我们首先在非叶子结点的数据页中判断MYSQL将去往哪一张叶子结点数据页中查询,如查询主键编号为120的行记录,经判断不再1-99的范围内那肯定我们需要的数据不再我们举例的叶子结点中,这样就带来一个十分明显的好处我们在B+树的每一层只需要去查询一个叶子节点的数据页。