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的主键,尽量用整型,而且是递增的整型. 如果是无规律的数据,将会产生的页的分裂,影响速度.
标签:非聚,聚簇,存储,索引,Innodb,Myisam,数据,主键 来源: https://blog.51cto.com/u_15230485/2821392