【MySQL】聚簇索引和非聚簇索引

本文深入解析MySQL中B+树索引的工作原理,对比InnoDB的聚簇索引与MyISAM的非聚簇索引,阐述两者在数据存储与检索效率上的差异。通过实例说明聚簇索引如何提升范围查询性能,以及非聚簇索引的额外I/O开销。

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

mysql普遍使用B+树做索引, 但在不同的存储引擎中对索引的实现方式不同
InnoDB是聚簇索引
MyISAM是非聚簇索引

以一本字典为例 如果想要翻到100页, 则如果翻到了50页就继续向后翻, 如果翻到了120页就往回翻, 翻到100页即可获得第100页的内容, 这种即为聚簇索引, 即B+树的叶子节点直接存储着数据.

如果想要得到index这个词, 则需要翻开前面的目录, 根据按字母排序的表找到i, 再找到index, 然后再根据页码翻到index的所在页, 这种为非聚簇索引, 即B+树的叶子节点存放的是数据的地址.

InnoDB聚簇索引

  1. 主键索引
    一个B+树保存了索引和具体的数据, key为主键, 叶子存储data数据行, 因此索引文件即为数据文件.
    聚簇索引的数据的物理存放顺序与索引顺序是一致的, 所以在InnoDB引擎下必须要有主键, 最好设置ID为自增的, 让数据的物理地址连续, 使聚簇索引范围查询效率较高,这样也可以减少磁盘碎片, 提高存储效率.

  2. 辅助索引
    InnoDB的辅助索引叶子节点data存储的是主键key值, 因为数据是按照主键来存储的, 所以使用辅助索引查找时首先根据辅助索引找到主键key值, 之后再根据key值去主键索引查询获得data.

MyISAM非聚簇索引

与聚簇索引不同的是叶子结点data存储的是数据的地址. 通过索引先查询到数据的地址, 再通过地址获取数据,
所以索引文件和数据文件是分开的,索引的逻辑顺序和物理地址顺序没有必然联系
所以在查询时会多一次IO操作, 查询性能上会差一些
因为叶子节点存储的是数据的地址, 所以辅助索引和主索引没有太大区别.

123

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值