聚簇索引:索引和数据放在同一文件,索引的顺序就是数据的物理存储顺序,一份数据物理上储存位置是唯一的,因而一份数据也最多只能有一个聚簇索引;
非聚簇索引:索引和数据是分开的,索引中记录着数据的存储位置;
不管是聚簇还是非聚簇索引,在MySql中数据结构都是使用B+树,使用B+树索引的最大考虑就是磁盘IO,因为一般索引很大,不可能把索引信息都存在内存中,所以需要存储在磁盘上,然后按需加载到内存中,而加载的过程中,磁盘IO(寻道时间、等待时间、传输时间)时间相对很长,如果IO次数越多,性能就会越差,磁盘IO读取单位是磁盘块,所以尽量在一个磁盘快中放更多的索引关键字,有利于索引的效率,而B+树中每个节点就相当于一个磁盘块。
MySql聚簇索引和非聚簇索引,主要应用在其InnoDB引擎和MyISAM引擎中,关于数据库引擎请参考:https://blog.csdn.net/firstendhappy/article/details/104530044
InnoDB引擎中索引结构描述
InnoDB中主键索引即是聚簇索引,如果建表的时候没有主键,那么会找表中唯一且不为空的字段构建聚簇索引,如果仍然没有这种字段,会隐式的创建一个主键构建聚簇索引;其二级索引在聚簇的概念上应该算是非聚簇索引;
主键索引非叶子节点保存关键字key和下一个节点的指针信息,叶子节点中保存着关键字key和其对应的数据信息,叶子节点也会保存下一个顺序节点的指针,形成链表结构,这样能提升范围搜索的效率;
二级索引(辅助索引)非叶子节点中保存关键字key和下一个节点的指针信息,叶子节点中保存关键字key和主键信息,所以需要通过主键key进行第二次搜索;
MyISAM引擎中索引结构描述
MyISAM中主键索引和二级索引都属于非聚簇索引;
主键索引非叶子节点保存关键字key和下一节点指针,叶子节点保存关键字key和数据的指针,同样叶子节点之间形成链表结构;
二级索引(辅助索引)跟主键索引别无二致,除了主键索引是唯一值,而二级索引可以有重复值;
InnoDB聚簇索引和MyISAM非聚簇索引对比
1、InnoDB聚簇索引在加载叶子节点的时候就加载到了数据,所以通过聚簇索引检索效率更高(这里只是说聚簇索引检索效率高,不是说InnoDB读就一定会快,因为真正的数据库读,还有其他很多因素,比如事务、缓存机制等);
2、聚簇索引如果不是构建在自增长主键而是一个类似UUID的字符串上,那么insert数据时,由于主键几乎是乱序的,会导致数据存储位置频繁移动,从而构建成本会相当大,而对于非聚簇索引来说,数据本身就是凌乱的,所以数据本身不需要有序,不需要在磁盘上频繁组织数据存储。
3、InnoDB二级索引叶子几点存储的是主键,需要二次索引,这样索引性能相对较差,但是当数据位置发生变化时,由于只记录了主键信息,不会发生更新,减少了维护成本;
4、对于范围搜索而言,因为聚簇索引的数据都是顺序物理储存的,磁盘IO时间相对会少很多,因而比非聚簇索引更快。