MySQL汇集索引和非汇集索引

索引分为汇集索引和非汇集索引,mysql中不一样的存储引擎对索引的底层实现可能会不一样,这里只关注mysql的默认存储引擎InnoDB。
利用下面的命令能够查看默认的存储引擎html

show variables like '%storage_engine%';

汇集索引:

索引中键值的逻辑顺序决定了表中相应行的物理顺序(索引中的数据物理存放地址和索引的顺序是一致的),能够这么理解:只要是索引是连续的,那么数据在存储介质上的存储位置也是连续的。
比方说:想要到字典上查找一个字,咱们能够根据字典前面的拼音找到该字,注意拼音的排列时有顺序的。mysql

打个比方:当咱们想要找“啊”这个字,而后又想找“不”这个字,根据拼音来看“b”必定在”a“的后面。sql

汇集索引就像咱们根据拼音的顺序查字典同样,能够大大的提升效率。在常常搜索必定范围的值时,经过索引找到第一条数据,根据物理地址连续存储的特色,而后检索相邻的数据,直到到达条件截至项。数据库

非汇集索引

索引的逻辑顺序与磁盘上的物理存储顺序不一样。非汇集索引的键值在逻辑上也是连续的,可是表中的数据在存储介质上的物理顺序是不一致的,即记录的逻辑顺序和实际存储的物理顺序没有任何联系。索引的记录节点有一个数据指针指向真正的数据存储位置。性能

非汇集索引就像根据偏旁部首查字典同样,字典前面的目录在逻辑上也是连续的,可是查两个偏旁在目录上挨着的字时,字典中的字却很不多是挨着的。优化


下面是MySQL文档中关于索引的说明:文档说明指针

每一个InnoDB表有一个特殊的指数称为汇集索引所在的行的数据存储。一般,汇集索引是主键的同义词。从查询,插入性能最好,和其余的数据库操做,必须了解InnoDB使用汇集索引来优化每一个表最多见的查询和DML操做。
当你定义你的表的主键,InnoDB使用它做为汇集索引。为您建立的每一个表定义一个主键。若是没有逻辑惟一的和非空的列或列集,添加一个新的自动增量列,它的值自动填充。
若是你不肯定你的表的主键、惟一索引,MySQL定位第一全部键列不为空,InnoDB使用它做为汇集索引。
若是表没有主键或惟一索引InnoDB内部适用,生成一个隐藏的汇集索引为合成列包含行ID值gen_clust_index。行的ID,InnoDB分配在这样一个表中的行排序。行ID是一个6字节字段的单调增长,在插入新行。所以,行id命令的行在物理上是插入顺序。code

总结以下:htm

  • 若是一个主键被定义了,那么这个主键就是做为汇集索引
  • 若是没有主键被定义,那么该表的第一个惟一非空索引被做为汇集索引
  • 若是没有主键也没有合适的惟一索引,那么innodb内部会生成一个隐藏的主键做为汇集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。

InnoDB引擎会为每张表都加一个汇集索引,而汇集索引指向的的数据又是以物理磁盘顺序来存储的,自增的主键会把数据自动向后插入,避免了插入过程当中的汇集索引排序问题。若是对汇集索引进行排序,这会带来磁盘IO性能损耗是很是大的。排序

相关文章
相关标签/搜索