首先你要明白几件事:
1. b+ 树存储数据的特点?
1. B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。
2. 之所以这么做是因为在数据库中页的大小是固定的,innodb中页的默认大小是16KB。
3. 如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。
4. 另外,B+树的阶数是等于键值的数量的,如果我们的B+树一个节点可以存储1000个键值,
那么3层B+树可以存储1000×1000×1000=10亿个数据。一般根节点是常驻内存的,所以一般我们查找10亿数据,只需要2次磁盘IO。
5. B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的。
6. 那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。
7. 而B树因为数据分散在各个节点,要实现这一点是很不容易的
2.B+树索引按照存储方式的不同分为聚集索引和非聚集索引?
聚集索引(聚簇索引):
以innodb作为存储引擎的表,表中的数据都会有一个主键,
即使你不创建主键,系统也会帮你创建一个隐式的主键。
这是因为innodb是把数据存放在B+树中的,而B+树的键值就是主键,
在B+树的叶子节点中,存储了表中所有的数据。这种以主键作为B+树索引的键值而构建的B+树索引,我们称之为聚集索引。
非聚集索引(非聚簇索引):
以主键以外的列值作为键值构建的B+树索引,我们称之为非聚集索引。
非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据,
而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表。
明白了聚集索引和非聚集索引的定义,我们应该明白这样一句话:数据即索引,索引即数据。
为什么? 相信你有个基本的概念了!