再聊 MySQL 聚簇索引

news2025/3/10 5:29:54

为什么是再次理解呢?因为松哥之前写过相关的文章介绍过聚簇索引,但是感觉还不够,因此今天想再来和小伙伴们聊一聊这个话题。

1. 什么是聚簇索引

数据库的索引从不同的角度可以划分成不同的类型,聚簇索引便是其中一种。

聚簇索引英文是 Clustered Index,有时候小伙伴们可能也会看到有人将之称为聚集索引等,与之相对的是非聚簇索引或者二级索引。

聚簇索引并不是一种单独的索引类型,而是一种数据的存储方式。在 MySQL 的 InnoDB 存储引擎中,所谓的聚簇索引实际上就是在同一个 B+Tree 中保存了索引和数据行:此时,数据放在叶子结点中,聚簇聚簇,意思就是说数据行和对应的键值紧凑的存在一起。

假设我有如下数据:

id(主键)usernameageaddressgender
1ab99深圳
2ac98广州
3af88北京
4bc80上海
5bg85重庆
6bw95天津
7bw99海口
8cc92武汉
9ck90深圳
10cx93深圳

那么它的聚簇索引大概就是这个样子:

那么大家可以看到,叶子上既有主键值(索引)又有数据行,节点上则只有主键值(索引)。

小伙伴们想想,MySQL 表中的数据在磁盘中只可能保存一份,不可能保存两份,所以,在一个表中,聚簇索引只可能有一个,不可能有多个。

2. 聚簇索引和主键

有的小伙伴搞不清楚这两者之间的关系,甚至将两者划等号,这是一个巨大的误区。

在有的数据库中,支持开发者自由的选择使用哪一个索引作为聚簇索引,但是 MySQL 中是不支持这个特性的。

在 MySQL 中,如果表本身就有设置主键,那么主键就是聚簇索引;如果表本身没有设置主键,则会选择表中的一个唯一且非空的索引来作为聚簇索引;如果表中连唯一非空的索引都没有,那么就会自动选择表中的隐式主键来作为聚簇索引。关于 MySQL 中表的隐式主键,松哥会在将来的文章中和大家介绍。

不过一般来说,还是建议大家自己来为表设置主键,因为隐式主键是自增的,自增的都会存在一个问题:在自增值上会存在非常高的锁竞争问题,主键的上界会称为热点数据,因为所有的插入操作都要主键自增,又不能重复,所以会发生锁竞争进而导致性能降低。

根据上面的介绍,我们可以总结出 MySQL 中聚簇索引和主键索引的关系如下:

  1. 聚簇索引不一定是主键索引。
  2. 主键索引一定是聚簇索引。

3. 聚簇索引优缺点

先来说优点:

  1. 相互关联的数据我们可以将之保存在一起。例如有一个用户订单表,我们可以根据 用户 ID + 订单 ID 来聚集所有数据,用户 ID 可能会重复,订单 ID 则不会重复,这样我们就能够将一个用户相关的订单数据都保存在一起,如果需要查询一个用户的所有订单,就会非常快,只需要少量的磁盘 IO 就可以做到。
  2. 不需要回表,因此数据访问速度更快。在聚簇索引中,索引和数据都在同一棵 B+Tree 上,因此从聚簇索引中获取到的数据比从非聚簇索引上获取数据更快(非聚簇索引需要回表)。
  3. 对于第一点的案例,如果我们想根据用户 ID 查询到这个用户所有的订单 ID,那么此时都不用去到叶子结点了,因为支节点上就有我们需要的数据,所以直接利用覆盖索引的特性,就可以读取到需要的数据。

这些就是聚簇索引一些常见的优点,我们在日常的表设计中,其实应该充分利用好这些优点。

再来看看缺点:

  1. 小伙伴们发现,前面我们说的聚簇索引的优势主要是聚簇索引减少了 IO 次数,从而提高了数据库的性能,但是有的 IO 密集型应用,可能直接上一个足够大的内存,把数据都读取到内存中操作,此时聚簇索引就没有啥优势了。
  2. 随机主键会导致页分裂问题,主键顺序插入的话,相对来说效率会高一些,因为在 B+Tree 中只需要不断往后面追加即可;但是主键如果是非顺序插入的话,效率就会低很多,因为可能会涉及到页分裂问题。以上面那张图为例,假设每个节点可以保存三条数据,现在我们要插入一个主键是 4.5 的记录,那么就需要把主键为 5 的值往后移动,进而导致主键为 8 的节点也要往后移动。页分裂会导致数据插入效率降低并且占用更多的存储空间。
  3. 非聚簇索引(二级索引)查询的时候需要回表。因为一个索引就是一棵索引树,数据都在聚簇索引上,所以如果使用非聚簇索引进行搜索,非聚簇索引的叶子上存储的是主键值,先找到主键值,然后拿着主键值再来聚簇索引上搜索,这样一共就查询了两棵索引树,这就是回表。

4. 最佳实践

看了上面的介绍,相信小伙伴已经了解了,在使用聚簇索引的时候,主键最好不要使用 UUID 这种随机字符串,使用 UUID 随机字符串至少存在两方面的问题:

  1. 插入效率低,因为插入可能会导致页分裂,这个前面已经说过了。
  2. UUID 字符串所占用的存储空间远远大于一个 bigint,如果使用 UUID 来做主键,意味着在二级索引中,一个叶子结点能够存储的主键值就非常有限,进而可能会导致树增高,搜索时候 IO 次数增多,性能下降。

所以相对来说,主键自增会优于 UUID。那么主键自增就是最完美的方案了吗?很多小伙伴可能也听说过一句话:没有银弹!所以,主键自增其实也有问题,具体什么问题,我们下便文章继续。

 

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

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

相关文章

家用洗地机怎么选?洗地机选购技巧分享

洗地机是一种专业的清洁设备,广泛应用于商业和工业领域。它可以有效地清洗和护理各种硬表面地板,如混凝土、大理石、瓷砖和木地板等。洗地机不仅能够提高清洁效率,还可以使地面更加卫生、美观和持久。而且大部分洗地机还拥有一键自清洁、除菌…

为什么企业都需要搭建搭建一个内部知识库?

企业内部知识管理是指企业通过各种手段收集、整理、管理和传播企业内部的知识,以提高企业的竞争力和创新能力。在实践中,企业内部知识管理往往需要建立一个内部知识库,以更好地实现知识的共享和管理。本文将从以下几个方面探讨为什么企业内部…

华为豪气分红720亿,持股员工人均超50万?

当有的公司还在因为各种原因裁员的时候,有的公司已经要分红了。 最近,华为在内部论坛“心声社区”公布,经华为公司内部有权机构决议,拟向股东分配股利人民币 719.55 亿元。相比 2021 年分红总额 614.04 亿元,同比增加…

centos8与centos7对比

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…

计算广告(十三)

Wide & Deep Wide & Deep模型是一种结合了广度学习(wide learning)和深度学习(deep learning)方法的混合模型。它旨在解决推荐系统中的记忆(memorization)和泛化(generalization&#…

使用Java操作文件与文件IO流(字节流,缓冲字节流,字符流,缓冲字符流)

文章目录 1. 认识文件2. 文件的类型3. 操作文件3.1 属性3.2 构造方法3.3 常用方法 4. IO流4.1 字节流4.1.1 InputStream4.1.2 OutputStream4.1.3 flush刷新4.1.4 关闭文件close4.1.5 字节缓冲流 4.2 字符流4.2.1 Reader4.2.2 Writer4.2.3 Scanner4.2.4 字符缓冲流 5. 复制文件5…

深度学习优化方法

如有错误,感谢不吝赐教、交流 文章目录 一、梯度下降如何选择学习率不能太小不能太大 二、小批量随机梯度下降如何选择批量大小不能太小不能太大 总结 三、常用优化方法SGDAdagradAdam实现大佬经验 一、梯度下降 如何选择学习率 不能太小 以缓慢的速度接近最优值&…

sqoop的介绍与安装

简介 Sqoop 是一款开源的工具,主要用于在 Hadoop(Hive) 与传统的数据库 (mysql 、 postgresql...) 间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres 等)中的 数据导进到 Hadoop 的 …

从单兵作战到生态共创,纵目科技打响智驾2.0新战役

4月18日,第十二届上海国际汽车工业展览会(简称:2023上海车展)在上海国家会展中心盛大启幕。纵目科技携最新自动驾驶解决方案——Amphiman 3000、8000行泊一体解决方案、Trinity 3000、8000舱行泊一体解决方案以及众多摄像头产品强…

15-721 Chapter8 数据分布model分析

Data Organization 有两个data pool,一个是不可变长的block,一个是可变长的block,然后要定位的话,我们只要知道是哪个block,和他的offset,我们就可以定位 下面是数据类型,单个类型太大的话,我们要来个溢出…

真的很迷茫!

作者:阿秀 校招八股文学习网站:https://interviewguide.cn 这是阿秀的第「258」篇原创 小伙伴们大家好,我是阿秀。 欢迎今年参加秋招的小伙伴加入阿秀的学习圈,目前已经超过 2300 小伙伴加入!去年认真准备和走下来的基…

vue 中quill-editor富文本图片和视频上传功能

quill-editor富文本对于新手来说是个很友好的富文本编辑器。但是里面的图片上传和视频上传功能在实际的工作中不能满足要求。 1.原生的图片上传会转换成bas64格式, 2.视频上传只是个输入框,要有视频链接了才能添加视频;而且视频标签是iframe标签,并不是video标签。 现在…

大数据分析案例-基于XGBoost算法构造房屋租赁价格评估模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

asp.net+sqlserver基于web的在校大学生贷款管理系统

采用的技术: 1.ASP.NET框架; 2. SQL Server 数据库; 3.AJAX技术:它不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术; 4.HTML,CSSDIV,代码实现静态页面; 开…

HTML5 <output> 标签、HTML5 <optgroup> 标签

HTML5 <output> 标签 实例 HTML5 <output>标签用来定义不同类型的输出。请参考下述示例&#xff1a; 将计算结果显示在 <output> 元素中&#xff1a; <form oninput"x.valueparseInt(a.value)parseInt(b.value)">0<input type"ran…

达索系统基于系统工程的AUTOSAR设计端到端解决方案 | 达索系统百世慧®

目录 达索系统基于系统工程的AUTOSAR设计端到端解决方案 达索系统&#xff1a;陪伴AUTOSAR一起成长 达索系统的解决方案&#xff1a;MBSE和AUTOSAR结合 软件设计端到端的追溯能力 系统架构设计中的“条理分明” 全贯通的一站式平台 科技是第一生产力&#xff0c;达索系统…

项目设计:迷宫游戏设计day2

今天主要把搜出最短路径想出来了&#xff0c;但还是没有优化&#xff0c;其思想就是&#xff0c;再搜的时候&#xff0c;记录它的前驱结点&#xff0c;这样就能在最后的时候就可以把它的最短路径以反序遍历的方式&#xff0c;将他输出出来 明天再优化优化

JVM系统优化实践(17):线上GC案例(二)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; GC的概念并不难明白&#xff0c;而且它的原理也不复杂&#xff0c;但是很难用好。为什么&#xff1f;因为每个平台、架构、指标、运行环境都不一样&#xff0c;甚…

设计模式-行为型模式之中介者模式

2. 中介者模式 2.1. 模式动机 在用户与用户直接聊天的设计方案中&#xff0c;用户对象之间存在很强的 关联性&#xff0c;将导致系统出现如下问题&#xff1a; 系统结构复杂 对象之间存在大量的相互关联和调用&#xff0c;若有一个对象发生变化&#xff0c;则需要跟踪和该对象关…

初识 MongoDB

文章目录 一、简介二、体系结构三、数据类型四、特点五、应用场景 提示&#xff1a;以下是本篇文章正文内容&#xff0c;MongoDB 系列学习将会持续更新 一、简介 MongoDB 是一个文档数据库&#xff0c;是由字段和值对&#xff08;field:value&#xff09;组成的数据结构&…