聊聊MySQL的聚簇索引和非聚簇索引

news2024/11/17 5:44:42

文章目录

  • 1. 索引的分类
    • 1. 存储结构维度
    • 2. 功能维度
    • 3. 列数维度
    • 4. 存储方式维度
    • 5. 更新方式维度
  • 2. 聚簇索引
    • 2.1 什么是聚簇索引
    • 2.2 聚簇索引的工作原理
  • 3. 非聚簇索引(MySQL官方文档称为`Secondary Indexes`)
    • 3.1 什么是非聚簇索引
    • 3.2 非聚簇索引的工作原理
  • 4. 聚簇索引与非聚簇索引的区别

在这里插入图片描述
MySQL的聚簇索引和非聚簇索引翻译为中文也叫聚集索引,非聚集索引。英文有两种叫法 Clustered indexnon-Clustered index 。MySQL官方对 非聚集索引称之为 Secondary Indexes。所以遇到 Secondary Indexesnon-Clustered index等价。
MySQL官方文档介绍在 《15.6.2.1 Clustered and Secondary Indexes》https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html

1. 索引的分类

在了解聚簇索引和非聚簇索引之前,我们先对数据库索引的分类进行一个了解,不然繁杂的概念和分类会使得搞混,通常我们可以听到B-Tree索引、全文索引 、复合索引、 聚簇索引 、静态索引,其实这些描述都是站在不同维度的描述,B-Tree索引是站在存储结构的维度,全文索引是站在功能维度描述,所以我们先了解一下不同维度的索引描述。
以下是常见的一些维度:

1. 存储结构维度

索引类型描述适用场景
B-Tree索引基于平衡多路搜索树的索引结构,维护数据有序性范围查询、排序操作
Hash索引基于哈希表的索引结构,适合等值查询等值查询
R-Tree索引适用于存储和查询空间数据的树形结构地理空间数据的查询
Bitmap索引适用于低基数列的索引,占用空间小且查询效率高低基数列(不同值的数目较少)的索引

2. 功能维度

索引类型描述适用场景
普通索引基本的索引类型,无任何限制通用
唯一索引类似于普通索引,要求索引列的值必须唯一,通常用于主键确保索引列的唯一性
全文索引用于全文搜索全文搜索
空间索引用于地理空间数据的索引地理空间数据的查询

3. 列数维度

索引类型描述
单列索引仅包含一个字段的索引
复合索引包含多个字段的索引,可以是普通索引、唯一索引等

这些索引类型的选择取决于需要索引的列的组合和查询需求。复合索引可以更好地支持涉及多个列的查询,但需要权衡索引的大小和维护成本。

4. 存储方式维度

聚簇索引将数据行直接存储在索引中,因此范围查询和排序操作效率较高,而非聚簇索引则需要通过指针访问数据行。选择适当的索引类型取决于数据访问模式和查询需求。

索引类型描述
聚簇索引数据行存储在索引中,数据行的物理顺序与索引中的键值顺序一致
非聚簇索引索引中的键值顺序与数据行的物理顺序不一致,索引中包含指向数据行的指针

5. 更新方式维度

索引类型描述
静态索引仅在数据被插入、删除或更新时更新索引
动态索引在查询时实时更新索引

静态索引在数据被修改时才更新,因此可能存在索引与实际数据不一致的情况。它适用于数据变动较少的场景,可以提高插入、删除和更新操作的性能。动态索引则在查询时实时更新,确保索引与实际数据保持一致,适用于频繁变动的数据环境,但可能对写入操作的性能有一定影响。选择适当的索引类型应考虑数据变动频率和查询性能需求。

本章我们着重了解聚簇索引和非聚簇索引的工作原理

2. 聚簇索引

2.1 什么是聚簇索引

聚簇索引是一种特殊类型的索引,在存储引擎中,数据记录实际的存放方式会根据聚簇索引来组织。一个表中只能有一个聚簇索引,但可以有多个非聚簇索引。

在许多数据库系统中,聚簇索引通常就是主键索引。例如:

  1. 在MySQL的InnoDB引擎中,聚簇索引默认是主键,如果没有定义主键,MySQL会选择一个非空唯一索引代替,如果没有非空唯一索引,MySQL会自动创建一个隐藏的聚簇索引。

  2. 在SQL Server中,也可以选择用哪个列作为聚簇索引,但一般推荐使用主键。

  3. 在Oracle中,可以明确指定创建聚簇索引。

虽然聚簇索引在很多情况下被设置为主键,但并不意味着聚簇索引一定是主键。聚簇索引应该选择最能代表数据存储特征的那一列或几列,例如,如果一个表的数据经常按照某一列的顺序进行查找,那么这一列就非常适合做聚簇索引。
在这里插入图片描述

2.2 聚簇索引的工作原理

MySQL 8中的聚簇索引原理与之前版本类似,主要的工作原理是基于B+树数据结构进行排序和检索操作。

对于MySQL的InnoDB存储引擎,聚簇索引是按照主键的顺序来存储数据的。这意味着每个表只能有一个聚簇索引,如果没有明确指定主键,InnoDB会自动选择一个能作为主键的列或者自行生成一个。

以下是聚簇索引的工作原理:

  1. 查询操作:当执行查询操作时,InnoDB引擎会利用B+树的特性,从根节点开始,通过比较索引的键值找到对应的叶子节点(数据页),从而快速找到需要的数据。因为索引的键值和数据是在一起的,所以查询效率非常高。

  2. 插入和删除操作:当进行插入或删除操作时,InnoDB引擎需要找到对应的索引键值,然后在对应的位置插入新的数据或删除旧的数据。因为数据是按照键的顺序存储的,所以插入和删除操作可能会引发数据的移动,尤其是在插入时如果插入的数据键值在当前键值范围内则可能会触发数据页的分裂。

  3. 更新操作:当进行更新操作时,如果更新的是非索引列,那么只需定位到数据页并进行更新即可;但是如果更新的是索引列,那么可能会引发数据的移动,因为要保持数据的有序性。

设计聚簇索引时要尽可能选择稳定且不频繁变动的列作为主键,这样可以减少因为插入、删除和更新操作引发的数据移动,提高数据库的性能。

聚簇索引可以提高大多数查询操作的性能,因为它们为数据提供了更线性的访问路径,数据存储在页面中。此外,由于具有相似索引键值的行存储在一起,使用聚簇索引时,顺序检测预取更高效。
在这里插入图片描述

示例
假设我们有一个学生信息表,我们可以通过以下SQL语句创建这个表,并且设置id为主键,也就是聚簇索引:

CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    age INT
);

假设我们现在要查询id为100的学生的信息,我们可以通过以下SQL语句进行查询:

SELECT * FROM students WHERE id = 100;

在执行这个查询操作时,因为id是聚簇索引,所以MySQL会通过B+树的检索算法,从根节点开始,比较索引的键值,找到对应的叶子节点(数据页),然后读取该数据页,找到id为100的学生的信息,这个过程的效率非常高。

同样地,如果我们要更新id为100的学生的年龄,我们可以通过以下SQL语句进行更新:

UPDATE students SET age = 20 WHERE id = 100;

在执行这个更新操作时,MySQL也会先通过聚簇索引找到id为100的学生的信息,然后直接在数据页上进行更新操作。如果更新的是非索引列(在这个例子中,是age列),那么更新操作的效率也是非常高的。

如果更新的是索引列,那么可能会引发数据的移动,因为要保持数据的有序性。例如,如果我们要改变id为100的学生的id,那么可能就会引发数据的移动,因此,设计聚簇索引时,我们应该尽可能选择稳定且不频繁变动的列作为主键。

3. 非聚簇索引(MySQL官方文档称为Secondary Indexes

MySQL官方文档介绍在《15.6.2.1 Clustered and Secondary Indexes》

3.1 什么是非聚簇索引

非聚簇索引,也被称为二级索引或辅助索引,它的工作方式与聚簇索引有所不同。在非聚簇索引中,索引的逻辑顺序与磁盘上行的物理存储顺序不同。换句话说,非聚簇索引的逻辑顺序是索引的键值顺序,但是这个顺序并不等于数据在磁盘上的物理存储顺序。

在非聚簇索引中,每一个索引条目都包含了键值和一个指向该键值对应的数据行的指针。这个指针通常是数据行的物理地址或者是一个指向数据行的其他种类的标识符。

一个表可以有多个非聚簇索引。当查询不包含聚簇索引的列时,数据库系统会使用非聚簇索引来提高查询性能。

比如在一个员工表中,聚簇索引可能会基于员工的ID进行设置,而非聚簇索引可能会基于员工的姓名或者部门来设置。这样当查询姓名或者部门时,数据库系统就可以直接利用非聚簇索引进行查找,而不需要扫描整张表,从而提高了查询效率。
在这里插入图片描述

3.2 非聚簇索引的工作原理

非聚簇索引的工作原理与聚簇索引有些不同。非聚簇索引(也称为二级索引或辅助索引)并不会影响表中数据的物理存储顺序,而是创建一个单独的数据结构(通常是B+树)来存储索引列的值和对应的行指针。如上图示例。

非聚簇索引的工作原理:

  1. 查询操作:当执行查询操作时,数据库会从非聚簇索引的B+树的根节点开始,通过比较索引的键值找到对应的叶子节点。这个叶子节点包含了键值和一个指向该键值对应的数据行的指针。数据库通过这个指针找到实际的数据行。这个过程通常需要两次磁盘I/O操作,第一次是在索引上进行查找,第二次是通过找到的指针去数据文件中获取实际的数据行。

  2. 插入和删除操作:当进行插入或删除操作时,数据库需要同时在索引结构和数据文件中进行操作。首先,数据库会在索引结构中插入或删除对应的键值和行指针,然后在数据文件中插入或删除实际的数据行。

  3. 更新操作:当进行更新操作时,如果更新的是非索引列,那么数据库只需要在数据文件中更新对应的数据行即可;如果更新的是索引列,那么数据库需要同时在索引结构和数据文件中进行更新操作。

4. 聚簇索引与非聚簇索引的区别

聚簇索引非聚簇索引
查询速度通常较快,因为可以直接定位到数据较慢,因为需要先定位到索引,然后再通过索引找到数据
内存使用使用的内存较少,因为数据和索引在一起使用的内存较多,因为数据和索引是分开的
数据存储聚簇索引就是主数据,数据按照索引排序非聚簇索引是数据的一份索引,数据的物理排序与索引无关
索引数量一个表只能有一个聚簇索引一个表可以有多个非聚簇索引
数据存储能力聚簇索引存储数据本身非聚簇索引存储数据的指针,并不存储数据本身
存储内容聚簇索引存储实际的数据行非聚簇索引存储索引列和行指针
叶节点内容在聚簇索引中,叶节点就是实际的数据在非聚簇索引中,叶节点不是实际的数据,而只包含索引和行指针
数据顺序在聚簇索引中,数据物理存储的顺序与索引的顺序一致在非聚簇索引中,数据的物理存储顺序与索引顺序无关
索引类型聚簇索引是一种将表记录物理排序以匹配索引的索引类型非聚簇索引是一种索引的逻辑顺序与数据在磁盘上的物理存储顺序无关的索引类型
索引大小主聚簇索引的大小一般较大相对而言,非聚簇索引的大小较小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win7怎么录屏视频?小白也能轻松学会

“win7怎么录屏视频呀?在学校机房上课,电脑都是win7系统的,每次需要录屏的时候都找不到方法,问了老师也解决不了,有人知道win7怎么录屏吗?” Windows 7系统已经逐渐淡出了主流操作系统的行列,但…

JVM上篇之虚拟机与java虚拟机介绍

目录 虚拟机 java虚拟机 简介 特点 作用 位置 整体结构 类装载子系统 运行时数据区 java执行引擎 Java代码执行流程 jvm架构模型 基于栈式架构 基于寄存器架构 总结 jvm的生命周期 1.启动 2.执行 3.退出 JVM的发展历程 虚拟机 所谓虚拟机,指的…

要体验 AI 编程助手吗?

能不能用 AI 编程辅助写代码? 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术…

强化学习实践(二)Gym(安装、环境搭建、运行倒立摆(代码可运行))

1.准备工作 优先选用conda,conda不仅可以安装python,也是环境管理的工具,我们可以通过conda创建python环境,每个环境之间是相互独立,这样不同的环境可以使用不同版本的python,不同版本的开发包,…

UEditorPlus v3.5.0 支持音频组件,字体图标请求合并,服务器配置优化

UEditor是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,更符…

栈溢出至getshell分析及利用

公众号:掌控安全EDU 分享更多技术文章,欢迎关注一起探讨学习 Ret2text(源程序中存在system及/bin/sh) 控制程序执行程序本身已有的的代码(.text)。栈溢出,存在system()函数以及”/bin/sh”字符串。通过溢出将返回地址…

LeetCode算法心得——有序三元组中的最大值 II (简单的动规思想)

大家好,我是晴天学长,枚举+简单的动态规划思想,需要的小伙伴可以关注支持一下哦!后续会继续更新的。 1) .有序三元组中的最大值 II 有序三元组中的最大值 II 给你一个下标从 0 开始的整数数组 nums 。 请你从所有满足 …

STM32F4X UCOSIII 互斥量

STM32F4X UCOSIII 互斥量 互斥量的概念互斥量的工作机制洗手间问题互斥量优先级继承没有优先级继承优先级继承 UCOSIII互斥量API互斥量创建函数互斥量删除函数互斥量申请函数互斥量释放函数 UCOSIII 互斥量例程 互斥量的概念 UCOSIII中的互斥量是一种特殊的信号量,…

重磅!这本SSCI期刊已解除On Hold状态!警惕目前6本SCIE/ESCI期刊被标记!

期刊动态:新增一本SSCI解除“On Hold” 最新消息,SSCI期刊Transformations in Business & Economics在之前被标记为On Hold,目前该标识已取消!表示目前该期刊被SSCI数据库正常收录检索。 往期期刊On Hold情况: …

云服务器CVM_云主机_云计算服务器_弹性云服务器-腾讯云

腾讯云服务器CVM提供安全可靠的弹性计算服务,腾讯云明星级云服务器,弹性计算实时扩展或缩减计算资源,支持包年包月、按量计费和竞价实例计费模式,CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格,提供9个9的数…

递归解析Json,实现生成可视化Tree+快速获取JsonPath | 京东云技术团队

内部平台的一个小功能点的实现过程,分享给大家: 递归解析Json,可以实现生成可视化Tree快速获取JsonPath。 步骤: 1.利用JsonPath读取根,获取JsonObject 2.递归层次遍历JsonObjec,保存结点信息 3.利用z…

钡铼BL124EC实现EtherCAT转Ethernet/IP的优势

钡铼技术的BL124EC是一款用于将EtherCAT从站转换为Ethernet/IP从站的网关设备。它是钡铼技术开发的高性能、可靠的工业自动化通信解决方案之一。 添加图片注释,不超过 140 字(可选) BL124EC网关可以应用于多种工业自动化场景,以下…

1.6 IntelliJ IDEA开发工具

前言: ### 1.6 IntelliJ IDEA开发工具笔记 - **背景**: - 使用基础文本编辑器如记事本编写Java代码虽然可行,但存在效率低下且难以调试的问题。 - 集成开发环境 (IDE) 可以有效地提高Java程序的开发效率。 - **常见Java IDE**&#xf…

解决docker开启MySQL的binlog无法成功。docker内部报错:mysql: [ERROR] unknown variable

1. 报错信息 2. 操作流程 整个流程是这样的: 我愉快的输入docker ps,查看MySQL的docker 容器id 执行指令docker exec -it 8a \bin\bash进入容器内部执行vim /etc/my.cnf,打开配置文件按照网上说的,添加如下配置信息退出docker容…

韦东山老师 RTOS 入门课程(二)理解任务的创建,切换过程

RTOS 的核心实现:保存,恢复现场 接下来开始尝试实现 RTOS。当然我们开发的时候其实不用这样做,现在尝试实现只是为了更好地理解原理。 RTOS 的核心就是刚才在研究的问题:保存和恢复现场。再追其本质,其实就是所有寄存…

【Linux】 文件类型和访问权限

执行 ls -l (或者:ll ) 指令查看文件的具体属性。 示例: drwxr-xr-x. 2 root root 33 10月 7 11:27 test2 看图说话: 下面是示例分解图 第一列的字符表示文件或目录的类型和权限。 第一个字符表示文件类型 例如&…

局域网内网管理软件有哪些功能?(局域网内网管理软件有哪些)

局域网(LAN)是指在一个小范围内(如一个办公室、一个楼层或者一个大楼)的计算机网络。随着互联网和科技的快速发展,局域网在企业、学校和个人生活中的应用越来越广泛。局域网内网管理软件是一种专门用于监控和控制局域网…

「天锐绿盾」——数据防泄露(智能透明加密保护)企业加密软件

天锐绿盾是一款专业的企业级加密软件,提供专业版、行业增强版和旗舰版,分别针对不同的用户需求。 PC访问地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 天锐绿盾数据防泄密模块,采取系统底…

【手绘 | 日漫风】从临摹开始控笔,线条,再到人体

博主:_LJaXi 专栏: Unity | 横版游戏开发 手绘入门 控笔 排线起稿方式九宫格起稿五官起稿专业起稿 握笔姿势三角握持姿势拇指指握姿势 勾线建议注意对于人体 控笔 排线 在绘画过程中,可以使用铅笔控制笔触的方向、压力和角度,以获…

tf卡损坏怎么修复恢复?

TF卡是一种极其微小的数据储存卡,常见于手机、行车记录仪、微型相机中。因为TF卡不具备读写保护功能,所以一旦发生损坏就会非常麻烦。今天小编就给大家介绍一下,TF卡突然损坏什么原因,TF卡损坏怎么办一招帮你修复。 一、TF卡突然损…