MySql聚簇索引和非聚簇索引详解

聚簇索引:索引和数据放在同一文件,索引的顺序就是数据的物理存储顺序,一份数据物理上储存位置是唯一的,因而一份数据也最多只能有一个聚簇索引;

非聚簇索引:索引和数据是分开的,索引中记录着数据的存储位置;

不管是聚簇还是非聚簇索引,在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时间相对会少很多,因而比非聚簇索引更快。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值