MySQL_Innodb引擎_聚集索引,B+ 索引

1.mysql关于聚集索引、非聚集索引的总结

http://blog.itpub.net/30126024/viewspace-2221485/

 

2.mysql-聚集索引

https://www.cnblogs.com/happyflyingpig/p/7652553.html

 

B+ 索引

MySQL 的 innodb 引擎使用的是 B+ 树作为索引的组织结构

什么是B+树,B+树与B树之间有什么差异,请参考我的博文 :

https://blog.csdn.net/u010003835

 

MySQL_Innodb引擎_聚集索引,B+ 索引

以上图片就是一颗B+树,通过以上B+树的截图,不难发现 B+ 索引 有以下几个特点。

  • 查找效率比较固定,最终都是找到叶子节点,每次查找都要消耗树高的一个查找时间。
  • 最左前缀匹配,比如 左前缀匹配 才能覆盖索引
  • 范围查找效率高,因为非叶子节点存的都是范围值,查找范围十分方便
  • 进行表扫描方便,由于叶子节点间有前序索引链接,进行表扫描非常方便

 

 

 

聚集索引

  InnoDB 按照主键的查找效率是很高,因为使用了聚集索引。那么到底什么是聚集索引?

  其实聚集索引更主要的是一种数据存储格式。

  我们看下上图的 B+ 树的叶子节点 就能明白 聚集索引

MySQL_Innodb引擎_聚集索引,B+ 索引

叶子节点包含了完整的数据记录,并且数据的物理存放位置与索引顺序是一致的,这种索引就叫做聚集索引。 

 

聚集索引的特点 :

  •    mysql的 innodb 表,就是索引组织表,表中的所有数据行都放在索引上,这就约定了数据是严格按照顺序存放的,所以不管插入的先后顺序,它在那个物理上的那个位置与插入的先后顺序无关。
  •   聚集索引,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。
  •   聚集索引,叶子节点存的是整行数据,直接通过这个聚集索引的键值找到某行
  •   聚集索引,数据行和相邻的键值紧凑地存储在一起,因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚集索引。
  •   非聚集索引,叶子节点存的是字段的值,通过这个非聚集索引的键值找到对应的聚集索引字段的值,再通过聚集索引键值找到表的某行,类似 oracle 通过键值找到 RowID,再通过 RowID 找到行。
  •   mysql的 innodb 表,其聚集索引相当于整张表,而整张表也是聚集索引。默认通过主键聚集数据,如果没有定义主键,则选择第一个非空的唯一索引,如果没有非空唯一索引,则选择 RowID 来作为聚集索引
  • mysq l的 innodb 表,因为整张表也是聚集索引,select出来的结果是顺序排序的,比如主键字段的数据插入顺序可以是5、3、4、2、1,查询时不带order by得出的结果也是按1、2、3、4、5排序