本文只讨论innodb的b tree索引,对hash index不作讨论,感兴趣的朋友可以参考官方文档,对于innodb这种构建OLTP系统首选的存储引擎,他的索引也有一些特别的地方,innodb的b-tree索引其实分为两类,一类是primary  index(聚集索引),一类是secondary index(辅助索引也称非聚集索引) 。

下图是primary  index的结构:

Innodb索引浅析(一)_innodb 索引 

 

可以看到primary  index的leaf 页不仅有主键值还包含整行的数据其实就是聚集索引,这和其他关系数据库如ORACLE的b-tree索引是有区别,oracle的b-tree索引leaf页只有主键值和该行的rowid,其实innodb的表结构类似于oracle的索引组织表,innodb的表其实就是一个大索引,所有行数据都在leaf页上(按主键组织),那有的朋友肯定要问,如果表没有设计主键那Innodb表的结构是怎样,其实没有设计主键innodb的表也是索引组织表的结构,系统会自动生成一个6byte的列,以这个列为主键来组织表。

 

下面再看看innodb的secondary index结构:

 

Innodb索引浅析(一)_innodb 索引_02

secondary index(辅助索引)的结构也是b-tree索引,与primary  index不同的是辅助索引的leaf页不存储行数据,存储的是索引值和主键值,secondary index需要通过primary  index定位数据,所以通过secondary index查询相同数据需要的IO次数比使用primary key index多,效率会略低。

          总结:使用innodb时注意充分利用primary key,这样对数据库性能提高是有帮助的。