【MySQL进阶之路 | 高级篇】常见索引(聚簇索引, 二级索引)

news2024/12/24 3:08:08

1. 常见索引概念

索引按照物理实现方式,可以分为两种,聚簇索引和非聚簇索引.我们也把非聚簇索引称为二级索引或辅助索引.

(1). 聚簇索引

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式(所有的数据记录都存储在了叶子节点),也就是说所谓的索引即数据,数据即索引.MySQL8.0,在InnoDB存储引擎中索引和数据都存储在物理磁盘的.ibd文件中.

特点 : 

1. 使用记录主键值大小进行记录和页的排序

  • 页内记录是按照主键的大小顺序排成一个单向链表.
  • 各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表.
  • 存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中记录主键值的大小顺序排成双向链表.

2. b+树的叶子节点存储的是完整的用户记录.即这个记录存储了所有列的值,包括InnoDB自己添加的隐藏列.

我们把这种特征的b+树称为聚簇索引.所有的用户记录都存放在这个聚簇索引的叶子节点处.这种聚簇索引并不需要我们在MySQL语句中显式使用INDEX语句创建,InnoDB存储引擎会自动的为我们创建聚簇索引.

即一张新表,当插入一条记录时,底层就会自动构造b+树来创建索引.而不是等到添加很多记录后,才想起来使用INDEX语句才构造b+树创建索引.

如果表中有主键PRIMARY KEY,就会以该主键列创建索引,如果没有主键,则会选择一个非空唯一键来创建索引,如果即没有主键也没有唯一键,则会使用记录头信息中的隐藏列row_id(InnoDB默认为表添加)来作为主键创建索引.

优点

  • 数据访问更快.因为聚簇索引将索引和数据都保存在同一个b+树中,因此聚簇索引比非聚簇索引查找速度更快.
  • 聚簇索引对于主键的排序查找和范围查找速度非常快.
  • 按照聚簇索引排列顺序,查询显示一定范围数据时,由于数据是相对紧密相连的,数据库不用从多个数据块中提取数据,节省大量的I/O操作.

缺点

  • 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能.因此,对于InnoDB表,我们一般都会定义一个自增的id列为主键.
  • 更新主键的代价很高. 因为将会导致被更新的行移动.因此对于InnoDB表我们一般定义主键为不可更新的.
  • 二级索引访问需要两次索引查找,第一次找到主键值,第二次通过主键值找到行数据.

限制

  • 对于MySQL数据库,目前只有InnoDB支持聚簇索引.而MyISAM不支持.
  • 由于数据物理存储排序方式只能有一种方式,所以每个MySQL的表只能有一个聚簇索引.一般情况下,即该表的主键.
  • 如果没有主键,会选择非空的唯一索引代替.如果也没有非空的唯一索引,InnoDB会隐式定义一个主键(row_id)作为聚簇索引.

(2). 二级索引

上面介绍的聚簇索引只能在搜索条件是主键值时才能发挥作用.因为b+树中的数据都是按照主键值的顺序来排序的.那么如果我们想根据别的列作为搜索条件该咋办呢.

我们可以多建几个b+树. 不同的b+树中的数据采用不同的排序规则.比方说我们用c2列来构建一个b+树.

78e7625e3b6c46a4bb7d3c8f18b1854f.png

该b+树与上述聚簇索引的b+树有几点不同.

  • 使用记录c2的列的大小进行记录和页的排序.
  • b+树的叶子节点存储的不是完整的用户记录.而是c2列+主键这两个列的值.通过该主键值再进行回表操作去聚簇索引的b+树中查询完整的记录.
  • 目标项记录不再是主键+页号,而是c2列+页号.

问 : 我们为什么需要回表.

如果把完整的用户记录放到叶子节点是可以不用回表的,但太占地方了.相当于每创建一个b+树都需要把所有的用户记录再都拷贝一遍,过于浪费存储空间.

因为这种按照非主键列建立的b+树需要一次回表的操作才可以定位到完整的用户记录.所以把这种b+树结构叫做二级索引.由于我们使用的是c2列的大小作为b+树的排序规则,所以我们称为这个b+树为c2列建立的索引.

与聚簇索引的区别.

  • 聚簇索引的叶子节点存储的是我们的数据记录,非聚簇索引的叶子节点存储的是数据位置.非聚簇索引不会影响数据表的物理存储结构.
  • 一个表只能有一个聚簇索引.因为只有一种依据主键的排序方式.但可以有很多个非聚簇索引.也就是多个索引提供数据检索.
  • 使用聚簇索引的时候,数据查询效率很高.但如果对数据进行插入删除更改等操作时,效率会比非聚簇索引的低.

3. 联合索引

我们也可以多个列的大小作为排序规则.也就是为多个列建立索引.比如我们想让b+树按照c2列和c3列的大小进行排序.这个包含两层含义.

  • 先把各个记录和页按照c2列排序
  • 当记录的c2列的值相同时,采用c3列进行排序.

5af2db1ff0ce411c9bfa25c88b88ccd1.png

以c2列c3列的大小为排序规则建立的b+树本质上也是二级索引.

2. InnoDB的b+树索引的注意事项

(1). 根页面位置万年不动

我们前面介绍b+树索引的时候,为了理解的方便,都是先把存储用户记录的叶子节点都画出来,然后接着画存储目录项记录的内节点.实际上,b+树的形成过程是这样的.

  • 每当为某个表创建一个b+树索引的时候,都会为这个索引创建一个根节点页面.最开始表中没有数据,每个+树索引对应的根节点中既没有用户记录,也没有目录项记录.
  • 随后向表中插入用户记录时,先将用户记录存储到这个根节点中.
  • 当根节点中的可用空间用完时继续插入,此时会将根节点中的所有记录复制到一个新分配的页,比如页a,然后对这个新页进行页分裂操作,得到新页页b.这时新插入的记录根据主键值的大小会被分配到页a或页b中.而根节点便升级为存储目录项的记录的页.

一个b+树索引的根节点子诞生开始,便不再移动.这样我们只要对某个表建立一个索引,那么它的根节点的页号便被记录到某个地方,然后凡是InnoDB存储引擎需要用到这个索引的时候,都会从固定的地方取出根节点的页号,从而访问该索引.

(2). 内节点中目录项记录的唯一性

我们知道b+树索引的内节点(非叶子节点)目录项记录的内容是索引列+页号.但这个搭配对二级索引来说有点不严谨.假设有个表的数据是这样的.

e3a44b13a2f541e6b30424df9a069609.png

如果二级索引中目录项记录的内容只是索引列+页号,那么为c2列建立索引后的b+树应该长这样.

d2122286865d4b36a9892c1dc14cf312.png

当我们想插入一行记录时,values(9,1,'c'),新插入的记录并不知道该放到页4还是页5.

如果我们把主键值也添加到二级索引内节点的目录项记录中,这样能保证b+树每一层节点中各条目录项记录除页号外是唯一的.所以我们为c2列建立二级索引后的示意图应该是这样的.

033fb9e836dc4afebd68883617806ba5.png

所以目录项记录中也必须存储主键值.而数据项记录中由于需要回表操作需要存储主键值这是毋庸置疑的.

(3). 一个页面最少存储两条记录

废话.

3. 索引的代价

(1). 空间上的代价

每建立一个索引都要为它建立一个b+树,每一个b+树的每一个节点都是一个数据页,一个页默认的大小是16kb,一个很大的b+树由许多的数据页组成,那就是很大的存储空间.

(2). 时间上的代价

每次对表的数据进行增删改等操作时,都需要去修改各个b+树的索引结构.b+树的每层节点(也就是页)都是按照索引列的值从小到大的顺序排序而组成了双向链表.不论是叶子节点上的记录,还是内节点中的目录项,都是按照索引列的值从小到大顺序形成的一个单向列表.而增删改等操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间进行一些记录移位,页分裂,页面回收等操作来维护节点和记录的排序.如果我们创建了很多索引,会给性能带来很大的不便.

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

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

相关文章

java之文件上传代码审计

1 文件上传漏洞审计 1.1 漏洞原理介绍 大部分文件上传漏洞的产生是因为Web应用程序未对文件的格式和进行严格过滤,导致用户可上传jsp、php等webshell代码文件,从而被利用。例如在 BBS发布图片 , 在个人网站发布ZIP压缩包, 在办公平台发布DOC文件等 , 只…

H3C综合实验

实验拓扑 实验要求 1、按照图示配置IP地址 2、sw1和sw2之间的直连链路配置链路聚合 3、 公司内部业务网段为VLAN10和VLAN20; VLAN 10是市场部,vlan20是技术部,要求对VLAN进行命名以便识别;PC1属于vlan10,PC2属于vlan20&#xf…

JavaScript事件传播_冒泡和捕获

事件传播分为冒泡(Bubbling)和捕获(Capturing)两种模式。 冒泡 ● 冒泡是指当一个元素上的事件被触发时,该事件会从最内层的元素开始向外层元素逐层传播,直到传播到最外层的祖先元素。 ● 举例来说&#…

vivado WIRE

WIRE是用于在Xilinx部件上路由连接或网络的设备对象。一根电线 是单个瓦片内部的一条互连金属。PIP、系紧装置和 SITE_PINs。 提示:WIRE对象不应与设计的Verilog文件中的WIRE实体混淆。那些 电线在设计中与网络有关,而不是与定义的设备的路由资源有关 WI…

Modbus协议转Profibus协议网关模块连PLC与激光发射器通讯

一、概述 在PLC控制系统中,从站设备通常以Modbus协议,ModbusTCP协议,Profinet协议,Profibus协议,Profibus DP协议,EtherCAT协议,EtherNET协议等。本文将重点探讨PLC连接Modbus协议转Profibus协…

芯片验证分享系列总结及PPT分享

大家好,我是谷公子。花了将近两个月时间,《芯片验证分享》这一系列视频分享已经更新完了,内容涵盖了名词解释、芯片验证原则、激励开发、代码审查以及芯片调试。这一系列视频主要侧重于芯片验证理论的分享,希望可以帮助大家构建芯…

PHP蜜语翻译器在线文字转码解码源码

源码介绍 PHP蜜语翻译器在线文字转码解码源码 文字加密通话、一键转换、蜜语密码 无需数据库,可以将文字、字母、数字、代码、表情、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容!支持在线加密解密 有多种加密展示…

亚马逊卖家注册业务类型怎么选?VC账号能申请?

在亚马逊卖家注册时,业务类型的选择是非常重要的,因为它将直接影响您的销售策略、费用结构以及您在平台上的权限。目前,亚马逊主要的卖家业务类型包括专业卖家和个人卖家,而VC(Vendor Central)账号和VE&…

AI创作音乐引发的深思

在最近一个月中,音乐大模型的迅速崛起让素人生产音乐的门槛降到了最低。这一变革引发了关于AI能否彻底颠覆音乐行业的广泛讨论。在初期的兴奋过后,人们开始更加理性地审视AI在音乐领域的应用,从版权归属、原创性、创作质量、道德层面以及法律…

飞睿智能UWB定位手环芯片模块,高速无线传输超宽带uwb定位技术,创新手环科技潮流

在数字化时代的浪潮中,我们每天都在享受着科技带来的便捷和惊喜。其中,定位技术作为现代科技的重要分支,已经深入我们生活的每一个角落。从智能手机导航到共享单车,从无人驾驶到物流追踪,定位技术都在默默发挥着它的作…

2024广东省职业技能大赛云计算赛项实战——Ansible部署Zabbix

Ansible部署Zabbix 前言 今年的比赛考了一道Ansible部署Zabbix的题目,要求就是用两台centos7.5的云主机,一台叫ansible,一台叫node,使用对应的软件包,通过ansible节点控制node节点安装zabbix服务。这道题还是算比较简…

缓存雪崩(主从复制、哨兵模式(脑裂)、分片集群)

缓存雪崩: 在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 方法一: 给不同key的TTL添加随机值,以此避免同一时间大量key失效。(用于解决同一时间大量key过期&…

环境配置04:Pytorch下载安装

说明: 显存大于4G的建议使用GPU版本的pytorch,低于4G建议使用CPU版本pytorch,直接使用命令安装对应版本即可 GPU版本的pytorch的使用需要显卡支持,需要先安装CUDA,即需要完成以下安装 1.查看已安装CUDA版本 GPU对应…

Zabbix 监控 Kubernetes 集群

Zabbix 监控 Kubernetes 集群 Zabbix作为一个成熟且功能强大的监控系统,被许多企业广泛采用。它能够对各种IT基础设施进行全面的监控,包括服务器、网络设备、应用程序等。而将Zabbix与Kubernetes结合,可以实现对Kubernetes集群的全面监控&am…

qt 简单实验 画一个等边三角形

1.概要 2.代码 2.1 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr)…

3.3 Ubuntu24使用kubeadm部署高可用K8S集群

Ubuntu24使用kubeadm部署高可用K8S集群 使用kubeadm部署一个k8s集群&#xff0c;3个master1个worker节点。 1. 环境信息 操作系统&#xff1a;ubuntu24.04内存: 2GBCPU: 2网络: 能够互访&#xff0c;能够访问互联网 hostnameip备注k8s-master1192.168.0.51master1k8s-maste…

可视化数据科学平台在信贷领域应用系列七:自动机器学习(下篇)

在当今金融科技迅速发展的时代&#xff0c;自动机器学习&#xff08;AutoML&#xff09;逐步成为了信贷风控领域的重要工具。随着大数据和人工智能技术的进步以及信贷风险环境的快速变化&#xff0c;传统人工建模模式的时效性已经难以应对复杂多变的挑战。自动机器学习框架将数…

【linux】操作系统使用wget下载网络文件,内核tcpv4部分运行日志

打印日志代码及运行日志(多余日志被删除了些)&#xff1a; 登录 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/commit/55a53caa06c1472398fac30113c9731cb9e3b482 测试步骤和手段&#xff1a; 1、清空 kern.log&#xff1b; 2、使用wget 下载linux-6.9.tar.gz&…

芯片方案SIC88336血氧仪方案

血氧仪利用红外线光源照射患者手指末梢&#xff0c;在经过血液的时候&#xff0c;光线会被血液中的氧合血红蛋白和脱氧血红蛋白吸收。传感器感知到吸收的光强度变化&#xff0c;并将其转化为电信号发送给主机。主机通过处理这些信号&#xff0c;计算出血氧饱和度值&#xff0c;…