MySQL聚簇索引和非聚簇索引的理解

 作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。

热门文章推荐
(1)《人工智能时代,软件工程师们将会被取代?》
(2)《超全人工智能 AI工具导航网站合集》
(3)《如何写出高质量的文章:从战略到战术》
(4)《什么? 你还没用过 Cursor? 智能 AI 代码生成工具 Cursor 安装和使用介绍》
(5)《我的性能方法论》
(6)《无需魔法打开即用的 AI 工具集锦》

关于聚簇索引和非聚簇索引的概念很多同学找了很多教程但是仍然很迷糊。

这里给出一篇翻译,并给出我的配图,希望对大家理解有帮助。

英文原文:http://www.mysqltutorial.org/mysql-index/mysql-clustered-index/

一、聚簇索引的概念

一般来说索引就是如B-树这类可以来存储键值方便快速查找的数据结构。

聚簇索引是物理索引,数据表就是按顺序存储的,物理上是连续的。

一旦创建了聚簇索引,表中的所有列都根据构造聚簇索引的关键列来存储。

(我的理解,所有的记录行都根据聚簇索引顺序存储,如按照主键Id递增方式依次物理顺序存储)

因为聚簇索引是按该列的排序存储的,因此一个表只能有一个聚簇索引。

二、MySQL中InnoDB表的聚簇索引

每个InnoDB表都需要一个聚簇索引。该聚簇索引可以帮助表优化增删改查操作。

如果你为表定义了一个主键,MySQL将使用主键作为聚簇索引。

如果你不为表指定一个主键,MySQL讲索第一个组成列都not null的唯一索引作为聚簇索引。

如果InnoBD表没有主键且没有适合的唯一索引(没有构成该唯一索引的所有列都NOT NULL),MySQL将自动创建一个隐藏的名字为“GEN_CLUST_INDEX ”的聚簇索引。

因此每个InnoDB表都有且仅有一个聚簇索引。

所有不是聚簇索引的索引都叫非聚簇索引或者辅助索引。

在InnDB存储引擎中,每个辅助索引的每条记录都包含主键,也包含非聚簇索引指定的列。

MySQL使用这个主键值来检索局促索引。

因此应该尽可能将主键缩短,否则辅助索引占用空间会更大。

一般来说用自增的整数型列作为主键列。

-----------------------华丽分隔符-------------------

简单解释

聚簇索引和非聚簇索引

下面举例聚簇索引和非聚簇索引的区别。

注意:这里的主键是非自增的。普通索引K表示普通的索引非唯一索引。

主键是采用B+Tree的数据结构(请看左图),根据上文可以知主键为聚簇索引,物理存储是根据ID的增加排序递增连续存储的。

普通索引K也是B+Tree的数据结构(请看右图),但是它不是聚簇索引,因此为非聚簇索引或者辅助索引聚簇索引只可能是主键,或者所有组成唯一键的所有列都为NOT NULL的第一个唯一索引,或者隐式创建的聚簇索引这三种情况)。

他的叶子节点存储的是索引列的值,它的数据域是聚簇索引即ID。

假如普通索引k为非唯一索引,要查询k=3的数据。

需要在k索引查找k=3得到id=30。

然后在左侧的ID索引树查找ID=30对应的记录R3。

然后K索引树继续向右查找,发现下一个是k=5不满足(非唯一索引后面有可能有相等的值,因此向右查找到第一个不等于3的地方),停止。

整个过程从K索引树到主键索引树的过程叫做“回表”。

更多进阶内容参考极客时间《MySQL45讲》

创作不易,如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

  • 63
    点赞
  • 221
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明明如月学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值