聚簇索引和非聚簇索引

本文深入探讨了数据库索引中的聚簇与非聚簇索引概念,详细解释了它们在InnoDB和MyISAM存储引擎中的实现方式及优缺点。聚簇索引将索引和数据存储在一起,加快数据访问速度,但更新成本高;非聚簇索引存储数据地址,虽有额外读取开销,但在某些场景下更为灵活。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.聚簇索引

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。
当表有聚簇索引时,它的数据行实际上存放在索引的叶子页中。
因为无法同时把数据行存放在两个不同的对方,所以一个表只能有一个聚簇索引。

InnoDB通过主键聚集数据,
如果没有定义主键,InnoDB会选择一个唯一的的非空索引代替。
如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。

聚集的数据有一些重要的优点:
数据访问更快,聚簇索引将索引和数据保存在同一个B-Tree中,因此从簇聚索引中获取数据通常比在非聚簇索引中查找要快。

同时,簇聚索引也有一些缺点:
更新簇聚索引列的代价很高,因为会强制InnoDB将每个被更新的列移动到新的位置;(可能有页分裂问题,也就是树的变动)

innoDB主索引是聚集索引,辅助索引是非聚集,存储的是主键值
myIsam是非聚集索引,辅助索引和主索引都是存的数据行地址

磁盘读取时,系统将数据逻辑地址传给磁盘,磁盘的控制电路会解析出物理地址,即哪个磁道哪个扇区。
于是磁头需要前后移动到对应的磁道,消耗的时间叫寻道时间,然后磁盘旋转将对应的扇区转到磁头下,消耗的时间叫旋转时间。

聚簇索引和非聚簇索引的一个标志性区别就是聚簇索引的叶节点对应着数据页,从中间级的索引页的索引行直接对应着数据页。而非聚簇索引的索引B+树叶节点不是直接指向数据页面的。

所谓聚簇索引,就是指主索引文件和数据文件为同一份文件,聚簇索引主要用在Innodb存储引擎中。在该索引实现方式中B+Tree的叶子节点上的data就是数据本身,key为主键,如果是一般索引的话,data便会指向对应的主索引

非聚簇索引就是指B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。非聚簇索引比聚簇索引多了一次读取数据的IO操作,所以查找性能上会差

MyisAM索引与InnoDB索引相比较
MyisAM支持全文索引(FULLTEXT)、压缩索引,InnoDB不支持;
InnoDB支持事务,MyisAM不支持;
MyisAM顺序储存数据,索引叶子节点保存对应数据行地址,辅助索引很主键索引相差无几;InnoDB主键节点同时保存数据行,其他辅助索引保存的是主键索引的值;
MyisAM键值分离,索引载入内存(key_buffer_size),数据缓存依赖操作系统;InnoDB键值一起保存,索引与数据一起载入InnoDB缓冲池;MyisAM主键(唯一)索引按升序来存储存储,InnoDB则不一定
MyisAM索引的基数值(Cardinality,show index 命令可以看见)是精确的,InnoDB则是估计值。这里涉及到信息统计的知识,MyisAM统计信息是保存磁盘中,在alter表或Analyze table操作更新此信息,而InnoDB则是在表第一次打开的时候估计值保存在缓存区内;
MyisAM处理字符串索引时用增量保存的方式,如第一个索引是‘preform’,第二个是‘preformence’,则第二个保存是‘7,ance’,这个明显的好处是缩短索引,但是缺陷就是不支持倒序提取索引,必须顺序遍历获取索引

B-Tree:如果一次检索需要访问4个节点,数据库系统设计者利用磁盘预读原理,把节点的大小设计为一个页,那读取一个节点只需要一次I/O操作,完成这次检索操作,最多需要3次I/O(根节点常驻内存)。数据记录越小,每个节点存放的数据就越多,树的高度也就越小,I/O操作就少了,检索效率也就上去了。

B+Tree:非叶子节点只存key,大大滴减少了非叶子节点的大小,那么每个节点就可以存放更多的记录,树更矮了,I/O操作更少了。所以B+Tree拥有更好的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值