MySQL--聚集索引、辅助索引、回表查询和覆盖索引的原理

在MySQL中,索引是提高查询性能的核心工具。理解聚集索引辅助索引回表查询覆盖索引的原理,对于优化数据性能至关重要。以下是对这些概念的详细解释以及优化方法。

一、聚集索引(Clustered Index)

聚集索引决定了表中数据的物理存储顺序。每个表只能有一个聚集索引。(也叫聚簇索引)

特点

  • 数据存储:聚集索引的叶子节点存储的是整行数据

  • 默认索引:如果表定义了主键(PRIMARY KEY),MySQL会自动将主键作为聚集索引

  • 物理顺序:表中的数据按照聚集索引的顺序存储

示例:

CREATE TABLE users (
    id INT PRIMARY KEY,  -- id列是聚集索引
    username VARCHAR(255),
    age INT
);
  • 数据存储

    • 数据按照id列的值排序存储

    • 查询id列时,可以直接定位到数据行

优化建议

  • 选择合适的主键:主键应选择唯一且递增的列(如自增ID),以减少插入数据时的页分裂

  • 避免频繁更换主键:更新主键会导致数据行的物理位置发生变化,影响性能。

(当然很多也用uuid或者string形式的id当作主键,但由于目前MySQL默认引擎为InnoDB,而且InnoDB的数据结构为B+树,B+树的特点是叶子节点存储真实数据,而且从左到右叶子节点是有序的,uuid和Strng类型id的代入势必会导致新数据和老数据之间的id是无序的)

(关于页分裂是因为InnoDB存储引擎中,数据是以页为基础单位存储的,每一页通常为16KB,当16KB满了之后,结果发现又有在这个id范围内的id插入,就会导致超过页内存大小,这个时候就会页分裂)

(页分裂:当某个页中的数据超出容量限制(例如插入大量新数据或更新现有数据)时,MySQL会将当前页的数据分成两个页,新创建的页会接收部分数据。这一过程通常会导致性能开销,特别是在频繁写操作的场景下。 页合并:当删除或更新操作使页内数据过于稀疏时(例如利用率低于50%),MySQL可能会将该页的数据与相邻的页合并。这种操作虽然可以回收空间,但在执行过程中也会带来额外的性能消耗。)

(综上所述,页分裂和叶子节点有序的角度,id设为自增长,数据库的开销要小很多)

二、辅助索引(Secondary Index)

辅助索引是除聚集索引以外的其他索引,每个表可以有多个辅助索引

特点

  • 数据存储:辅助索引的叶子节点存储是主键值(聚集索引的键值)

  • 查询过程:通过辅助索引找到数据时,需要先找到主键值,再通过主键值查找整行数据(回表查询)

示例:

CREATE INDEX idx_username ON users(username);  -- 创建辅助索引
  • 数据存储

    • idx_username索引的叶子节点存储的是username和对应的id值

    • 查询username时,先通过idx_username找到id,再通过id找到整行数据

优化建议:

  • 选择性高的列:为选择性高的列(如唯一列或高基数列)创建辅助索引,以提高查询效率

  • 避免过多索引:过多的辅助索引会增加操作的开销(如INSERT、UPDATE、DELETE)

三、回表查询(Row Lookup)

回表查询是指通过辅助索引找到主键值后,再通过主键值查找整行数据的过程

示例:

-- 查询username为'john_doe'的用户
SELECT * FROM users WHERE username = 'john_doe';
  • 查询过程:

    1. 通过idx_username索引找到username='john_doe'对应的主键

    2. 通过主键在聚集索引中找到整行数据

优化建议:

  • 减少回表查询:使用覆盖索引(Covering Index)避免回表查询

四、覆盖索引(Covering Index)

覆盖索引是指索引包含了查询所需的所有列,查询可以直接从索引中获取数据,而无需回表。

特点:

  • 查询性能:覆盖索引可以显著提高查询性能,因为它避免了回表操作

  • 索引设计:覆盖索引需要包含查询中使用的所有列

示例:

-- 创建覆盖索引
CREATE INDEX idx_username_age ON users(username, age);
​
-- 使用覆盖索引查询
EXPLAIN SELECT username, age FROM users WHERE username = 'john_doe';
  • 执行计划分析

    • EXPLAIN结果中的Extra列会显示Using index,表明查询使用了覆盖索引。

优化建议:

  • 设计覆盖索引:根据查询需求,设计包含所有查询列的覆盖索引。

  • 避免过多列:覆盖索引不应包含过多列,以免增加索引大小和维护开销。

五、回表查询的优化方法

回表查询会增加查询开销,尤其是在大数据量和高并发场景下。以下是优化回表查询的常见方法:

方法1:使用覆盖索引

通过覆盖索引避免回表查询

-- 原始查询(需要回表)
SELECT * FROM users WHERE username = 'john_doe';
​
-- 优化查询(使用覆盖索引)
CREATE INDEX idx_username_age ON users(username, age);
SELECT username, age FROM users WHERE username = 'john_doe';

方法2:减少查询列

只查询需要的列,避免查询整行数据。

示例:

-- 原始查询(查询整行数据)
SELECT * FROM users WHERE username = 'john_doe';
​
-- 优化查询(只查询需要的列)
SELECT username, age FROM users WHERE username = 'john_doe';

方法3:优化索引设计

根据查询需求设计合适的索引,避免不必要的回表查询。

示例:

-- 原始索引
CREATE INDEX idx_username ON users(username);
​
-- 优化索引(覆盖索引)
CREATE INDEX idx_username_age ON users(username, age);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2+Element实现Excel文件上传下载预览【超详细图解】

目录 一、需求背景 二、落地实现 1.文件上传 图片示例 HTML代码 业务代码 2.文件下载 图片示例 方式一:代码 方式二:代码 3.文件预览 图片示例 方式一:代码 方式二:代码 一、需求背景 在一个愉快的年后&#xff…

在线会议时, 笔记本电脑的麦克风收音效果差是为什么

背景 最近在线面试. 使用腾讯会议或者飞书, 戴耳机参加在线面试, 遇到好几个面试官说我的音质不好. 一直没在意, 后来反思, 应该是电脑哪里出了问题. 排查 先买了一副品牌有线耳机, 测试后本地录制的声音仍然品质很差去掉耳机延长线后, 麦克风品质仍然很差最终找到答案, 原…

【十二】Golang 映射

💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…

【HarmonyOS Next】鸿蒙TaskPool和Worker详解 (一)

【HarmonyOS Next】鸿蒙TaskPool和Worker详解 (一) 一、TaskPool和Worker如何实现多线程?各自特点是什么? 在鸿蒙中通过TaskPool和Worker实现多线程并发,两者都基于Actor并发模型实现。 Actor并发模型,每…

FFmpeg.NET:.NET 平台上的音视频处理利器

FFmpeg.NET 是一个封装了 FFmpeg 功能的 .NET 库,能够方便地在 C# 项目中处理音视频文件。它支持多种操作,包括转码、剪辑、合并、分离音频等。 功能 解析元数据从视频生成缩略图使用以下参数将音频和视频转码为其他格式: 码率(…

计算机网络————(一)HTTP讲解

基础内容分类 从TCP/IP协议栈为依托,由上至下、从应用层到基础设施介绍协议。 1.应用层: HTTP/1.1 Websocket HTTP/2.0 2.应用层的安全基础设施 LTS/SSL 3.传输层 TCP 4.网络层及数据链路层 IP层和以太网 HTTP协议 网络页面形成基本 流程&#xff1a…

源码压缩包泄露

##解题思路 因为网站的文件都放在www下面,所以直接访问/www.zip就可以得到网页的源码压缩包 在fl000g.txt这个文件中看到一个flag{flag_here}不像是真的flag,尝试提交ctfshow{flag_here},果然提交失败 打开文件属性之类的,也没有…

组态软件在物联网中的应用

随着物联网的快速发展,组态软件在物联网中的应用也越来越广泛。组态软件是一种用于创建和管理物联网系统的可视化工具,它能够将传感器、设备和网络连接起来,实现数据的采集、分析和可视化。本文将探讨组态软件在物联网中的应用,并…

Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在互联网技术以日新月异之势迅猛发展的浪潮下,5G 通信技术的普及、云计算能力…

(论文)PartialSpoof 数据库和检测话语中嵌入的短假语音片段的对策

The PartialSpoof Database and Countermeasures for the Detection of Short Fake Speech Segments Embedded in an Utterance 摘要 自动说话人验证容易受到各种作和欺骗,例如文本到语音合成、语音转换、重放、篡改、对抗性攻击等。我们考虑一种称为“部分欺骗”…

Leaflet介绍及使用示例

一、Leaflet介绍 Leaflet是一个开源的JavaScript库,专门用于构建交互式的地图应用程序。它以其轻量级、高性能和易于使用的API而著称,方便开发者在网页中集成地图功能。Leaflet支持多种地图提供商的瓦片图层,如OpenStreetMap、Mapbox等&…

【笔记】redis回忆录(未完 重头过一遍)

了解 redis在linux上运行 没有window版本 有也是微软自己搞的 (一)安装与修改配置 1.在linux虚拟机上 安装gcc依赖 然后再usr/local/src解压在官网下载好的redis安装包 直接拖进去 tar -zxvf 安装包名字 tab键补齐 解压成功 进入软件 并执行编译命令…

使用 Apache Dubbo 释放 DeepSeek R1 的全部潜力

作者:陈子康,Apache Dubbo Contributor 2025年1月20日,国产大模型公司深度求索(DeepSeek)正式发布了大语言模型 DeepSeek-R1,并同步开源其模型权重。通过大规模强化学习技术,DeepSeek-R1 显著提…

Unity TMPro显示中文字体

TMP默认的字体只能显示英语,那么怎么显示中文呢 1、找到支持中文的字体文件 在c盘搜索Fonts文件夹有很多支持中文的字体文件 我这里选择雅黑 PS.双击打开发现里面有粗体细体普通三个版本,也可以只导入一个版本进去 2、将其拖入到unity Assets里面 3…

【MySQL篇】数据库基础

目录 1,什么是数据库? 2,主流数据库 3,MySQL介绍 1,MySQL架构 2,SQL分类 3,MySQL存储引擎 1,什么是数据库? 数据库(Database,简称DB&#xf…

Linux 日志系统·

目录 一、前言 二、实现一个简单的日志 1.可变参数 2.日志等级 3.日志时间 4.打印每一条参数 5.合并两个缓冲区 6.封装日志函数 三、完整代码 一、前言 当我们写一个函数,例如打开文件open,当我们打开失败的时候,会调用perror看到错误…

【PromptCoder】使用 package.json 生成 cursorrules

【PromptCoder】使用 package.json 生成 cursorrules 在当今快节奏的开发世界中,效率和准确性至关重要。开发者们不断寻找能够优化工作流程、帮助他们更快编写高质量代码的工具。Cursor 作为一款 AI 驱动的代码编辑器,正在彻底改变我们的编程方式。但如…

【VUE】vue-i18n: Uncaught SyntaxError: Not available in legacy mode

报错: 解决方法: 找到 createI18n 并加上 legacy: false,

2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码

一、混沌进化优化算法 https://github.com/ITyuanshou/MATLABCode 1. 算法简介 混沌进化优化算法(Chaotic Evolution Optimization, CEO)是2025年提出的一种受混沌动力学启发的新型元启发式算法。该算法的主要灵感来源于二维离散忆阻映射的混沌进化过…

网络安全之日志审计 网络安全审计制度

一、代码审计安全 代码编写安全: 程序的两大根本:变量与函数 漏洞形成的条件:可以控制的变量“一切输入都是有害的 ” 变量到达有利用价值的函数(危险函数)“一切进入函数的变量是有害的” 漏洞的利用效果取决于最终函数的功能,变量进入…