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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL聚簇索引和非聚簇索引的理解

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

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

英文原文: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使用这个主键值来检索局促索引。

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

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

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

简单解释

聚簇索引和非聚簇索引

image.png

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

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

image.png

主键是采用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讲》

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


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8月前
|
存储 关系型数据库 MySQL
MySQL中的回表
MySQL中的回表
|
8月前
|
SQL 关系型数据库 MySQL
mysql 索引-最左匹配
mysql 索引-最左匹配
61 0
|
8月前
|
存储 关系型数据库 MySQL
MySQL - 聚簇索引和非聚簇索引
MySQL - 聚簇索引和非聚簇索引
113 0
|
存储 SQL 关系型数据库
MySQL学习笔记-主键索引和二级索引
MySQL学习笔记-主键索引和二级索引
100 0
|
存储 关系型数据库 MySQL
Mysql什么是聚簇索引什么是非聚簇索引 ?
在MySQL中,聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)是两种不同的索引类型。
147 0
|
存储 关系型数据库 MySQL
【MySQL从入门到精通】【高级篇】(八)聚簇索引&非聚簇索引&联合索引
上一篇文章我们介绍了【MySQL从入门到精通】【高级篇】(七)设计一个索引&InnoDB中的索引方案,该文介绍了如何设计一个索引,以及InnoDB中的索引如何形成。
345 0
【MySQL从入门到精通】【高级篇】(八)聚簇索引&非聚簇索引&联合索引
|
存储 关系型数据库 MySQL
再聊 MySQL 聚簇索引
再聊 MySQL 聚簇索引
|
存储 关系型数据库 MySQL
MySQL InnoDB表和索引之聚簇索引与第二索引
MySQL InnoDB表和索引之聚簇索引与第二索引
98 0
|
存储 关系型数据库 MySQL
mysql聚簇索引和非聚簇索引
mysql聚簇索引和非聚簇索引
164 0
|
存储 关系型数据库 MySQL
【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引
【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引
【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引

热门文章

最新文章