Skip to content
Zhang Jc edited this page Nov 21, 2016 · 3 revisions

关于MySQL的索引

参考

http://blog.csdn.net/voidccc/article/details/40077329

https://blog.jcole.us/2013/01/07/the-physical-structure-of-innodb-index-pages/

InnoDB和MyISAM索引的区别

InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。 MyISAM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。

如何理解InnoDB的Clustered key和Secondary key

  1. 对于InnoDB来说,数据是存储在Page中的,而Page仅仅是一个方便存储的“容器”,它的大小是固定的(默认16K)。抛开具体Page“打包存储“的层次,原理上InnoDB其实是很多的索引树的,这些树是B+树。

  2. 对于InnoDB来说,索引树有Clustered key和Secondary key两种。前者叶子节点直接存储整个Row的数据,并以主键索引;后者以某一非主键索引,叶子节点为主键的值。

  3. 所以基于这一特性,基于主键的查找只需要涉及一棵Clustered key树,而基于非主键的查找需要先经过Secondary key找到主键,再拿主键在Clustered key树中查找,需要经过两棵树。

  4. 所有的这些索引树都被装入Page中进行存储。

Clone this wiki locally