前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL聚簇索引和非聚簇索引的理解

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

作者头像
明明如月学长
发布2021-08-31 14:52:46
1.3K0
发布2021-08-31 14:52:46
举报
文章被收录于专栏:明明如月的技术专栏

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

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

英文原文: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索引树到主键索引树的过程叫做“回表”。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、聚簇索引的概念
  • 二、MySQL中InnoDB表的聚簇索引
  • 简单解释
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档