Mysql聚簇索引和非聚簇索引的区别

先说一下Mysql常见的两种引擎,一种是Myisam,另一种是Innodb。

Myisam的数据存储有三种后缀类型的文件,.MYD,.MYI,.frm,而.MYI就是Myisam存储的索引文件,.MYD是数据存储文件,所以说Myisam数据和索引是分开的。

  • 在MYI文件里,存储的是一棵树,查找的方式是顺着文件找,找到后,叶子节点存储着目标数据在磁盘上的位置,也就是MYD文件中。Myisam索引是索引,数据是数据,所以根据页码找到对应的数据位置,正因为数据和索引是分开的,所以是成为非聚簇索引。
  • InnoDB是每一个叶子节点对应着一行数据,也就是把整行的数据和主键存储在一起了,找到了叶子,叶子旁边就是数据,不像Myisam一样,需要再次回磁盘找数据,那么Myisam这一步叫做回行操作。

对于Myisam而言,叶子比较轻,而Innodb叶子比较重,因为Innodb存储数据了。

再往进一步说,因为Myisam引擎下有多个索引,每个索引对应不同的索引文件;但Innodb引擎,比如ID是索引,这个字段存了数据,那么假如再在Innodb引擎表下创建一个索引,是不是也会同时再存储一遍当前行数据?这就不能是数据了,那么二级索引下存储的就不是当前行数据了,而是主键ID。所以总结一下,Myisam中主索引和次级索引都指向物理行,而Innodb主键索引直接存储当前行数据,次级索引下存储的是主键,再通过主键拿数据信息。

补充:对于Innodb而言

假如没有主键索引,则会以唯一索引作为主键;

如果没有唯一索引,则系统内部生成一个rawid做主键;

 

Innodb主键的索引结构中,既存储了主键值,又存储了数据,称之为聚簇索引。

 

 

聚簇索引的优缺点

优势: 根据主键查询条目比较少时,不用回行(数据就在主键节点下)

劣势: 如果碰到不规则数据插入时,造成频繁的页分裂.

 

聚簇索引的主键值,应尽量是连续增长的值,而不是要是随机值, (不要用随机字符串或UUID) 否则会造成大量的页分裂与页移动.

 

高性能索引策略

对于innodb而言,因为节点下有数据文件,因此节点的分裂将会比较慢. 对于innodb的主键,尽量用整型,而且是递增的整型. 如果是无规律的数据,将会产生的页的分裂,影响速度.

巩固

聚簇索引

聚集索引可以按照主键来排序存储数据,这样在查找行的时候非常有效。举个例子,如果是一本汉语字典,我们想要查找“数”这个字,直接在书中找汉语拼音的位置即可,也就是拼音“shu”。这样找到了索引的位置,在它后面就是我们想要找的数据行。

 非聚集索引又是什么呢?

 在数据库系统会有单独的存储空间存放非聚集索引,这些索引项是按照顺序存储的,但索引项指向的内容是随机存储的。也就是说系统会进行两次查找,第一次先找到索引,第二次找到索引对应的位置取出数据行。非聚集索引不会把索引指向的内容像聚集索引一样直接放到索引的后面,而是维护单独的索引表(只维护索引,不维护索引指向的数据),为数据检索提供方便。我们还以汉语字典为例,如果想要查找“数”字,那么按照部首查找的方式,先找到“数”字的偏旁部首,然后这个目录会告诉我们“数”字存放到第多少页,我们再去指定的页码找这个字。

聚集索引指表中数据行按索引的排序方式进行存储,对查找行很有效。只有当表包含聚集索引时,表内的数据行才会按找索引列的值在磁盘上进行物理排序和存储。每一个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。

聚集索引与非聚集索引的原理不同,在使用上也有一些区别:

  1. 聚集索引的叶子节点存储的就是我们的数据记录,非聚集索引的叶子节点存储的是数据位置。非聚集索引不会影响数据表的物理存储顺序。
  2. 一个表只能有一个聚集索引,因为只能有一种排序存储的方式,但可以有多个非聚集索引,也就是多个索引目录提供数据检索。
  3. 使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引低。

 

posted @ 2018-02-24 13:11  温柔的风  阅读(647)  评论(0编辑  收藏  举报