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);

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

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

相关文章

【Java项目】基于Spring Boot的网上商城购物系统

【Java项目】基于Spring Boot的网上商城购物系统 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:系统实现管理员:首页、个人中心、用户管理、商品分类管理、商品信息管理、订单评价管理、系统管理、订单管理&#x…

hbase笔记总结1

hbase是nosql的一种,非关系型数据库,not only sql,可处理大规模、高并发的数据,是web2.0以后的产物hbase的扩展性和灵活性更好,而且筛选能力相较于MySQL更优nosql的四大特点: 灵活的数据模型 (1…

谷云科技iPaaS×DeepSeek:构建企业智能集成的核心底座

2025年,DeepSeek大模型的爆发式普及,正引领软件行业实现 “智能跃迁”。从代码生成到系统集成,从企业级应用到消费级产品,自然语言交互能力已成为新一代软件的核心竞争力。据行业分析,超60%的软件企业已启动大模型适配…

学习笔记-大模型GGUF是什么?

GGUF(GPT-Generated Unified Format)是一种专为大模型设计的二进制文件存储格式,旨在高效存储和加载模型权重及元数据: 一、GGUF格式的核心特性与意义 高效加载与资源优化 GGUF通过二进制编码、内存映射(mmap&#xff…

当进行npm install指令,安装依赖的情况下,存在如下报错

当进行npm install指令,安装依赖的情况下,存在如下报错 D:\ssmprogramcode\springboot8i5qd7np\src\main\resources\front\front>npm install npm ERR! code ENOTFOUND npm ERR! errno ENOTFOUND npm ERR! network request to https://registry.nlar…

el-date-picker 组件限制禁止选择当前时间之前的时间

页面代码 <el-date-pickerv-model"xxx.startTime"type"datetime"placeholder"请选择开始时间"value-format"YYYY-MM-DD HH:mm:ss"clearable:disabledDate"disabledDateFn":disabled-hours"disabledHours":dis…

MySQL - 一条查询语句是怎么执行的?

一、执行流程 一条SQL语句&#xff0c;比如&#xff1a;SELECT * FROM users WHERE age > 18; 执行流程。 二、连接器 首先&#xff0c;这条SQL语句会来到MySQL的“大门”——连接器。连接器就像是一个门卫大叔&#xff0c;负责检查你的身份。它会验证你的用户名和密码&a…

秒杀系统的常用架构是什么?怎么设计?

架构 秒杀系统需要单独部署&#xff0c;如果说放在订单服务里面&#xff0c;秒杀的系统压力太大了就会影响正常的用户下单。 常用架构&#xff1a; Redis 数据倾斜问题 第一步扣减库存时 假设现在有 10 个商品需要秒杀&#xff0c;正常情况下&#xff0c;这 10 个商品应该均…

深度生成模型(二)——基本概念与数学建模

上一篇笔记中提到了端到端模型底层核心采用了深度生成模型&#xff0c;先简单梳理一下 生成式人工智能&#xff08;Artificial Intelligence Generated Content&#xff0c;AIGC&#xff09;经历了从早期基于概率模型和规则系统的方法到现代深度生成模型的跨越式发展 深度神经…

Oracle 查询表空间使用情况及收缩数据文件

本文介绍Oracle收缩数据文件的相关操作&#xff0c;运维工作中有时会需要通过收缩数据文件来释放磁盘空间。 数据文件初始化方式&#xff1a; 1.我们创建表空间一般有两种方式初始化其数据文件&#xff0c;即指定初始大小为32G&#xff08;很大的值&#xff09;或指定初始大小为…

3dtiles平移旋转工具制作

3dtiles平移旋转缩放原理及可视化工具实现 背景 平时工作中&#xff0c;通过cesium平台来搭建一个演示场景是很常见的事情。一般来说&#xff0c;演示场景不需要多完善的功能&#xff0c;但是需要一批三维模型搭建&#xff0c;如厂房、电力设备、园区等。在实际搭建过程中&…

Readability.js 与 Newspaper提取网页内容和元数据

在当今信息爆炸的时代&#xff0c;网页内容的提取和处理变得尤为重要。无论是从新闻网站、博客还是教程网站中提取内容&#xff0c;都需要一个高效、准确的工具来帮助我们去除无关信息&#xff0c;提取出有价值的正文内容。这不仅能够提高我们的工作效率&#xff0c;还能让我们…

Vue框架学习

一、Vue3 基础 创建vue3工程 安装Node.js在你所要存放目录位置 cmd 终端运行 npm create vuelatest输入工程名字需要ts JSX 选No 是否配置路由 NO&#xff08;初步学习&#xff09; 是否配置管理 No 是否配置测试 No Testing Solution NO 是否选择ESLint语法检查先不选 选NO…

部署若依微服务遇到的坑

一、用Windows部署nacos 1、启动失败&#xff0c;因为nacos默认开启为器群模式。单体需要加上图下代码 2、nacos配置内置MySQL时需要执行config文件夹下的SQL文件 3、springboot启动报错 java.nio.charset.MalformedInputException: Input length 1或Input length 2-CSDN博…

RabbitMQ系列(三)基本概念之Consumer

在 RabbitMQ 中&#xff0c;Consumer&#xff08;消费者&#xff09; 是负责从队列&#xff08;Queue&#xff09;中获取并处理消息的客户端角色&#xff0c;其核心机制与功能如下&#xff1a; 一、Consumer 的定义与核心作用 消息处理终端 Consumer 通过订阅或拉取队列中的消…

Trae根据原型设计稿生成微信小程序密码输入框的踩坑记录

一、需求描述 最近经常使用Trae生成一些小组件和功能代码&#xff08;对Trae赶兴趣的可以看之前的文章《TraeAi上手体验》&#xff09;&#xff0c;刚好在用uniapp开发微信小程序时需要开发一个输入密码的弹框组件&#xff0c;于是想用Trae来实现。原型设计稿如下&#xff1a;…

SuperMap iClient3D for WebGL 影像数据可视范围控制

在共享同一影像底图的服务场景中&#xff0c;如何基于用户权限体系实现差异化的数据可视范围控制&#xff1f;SuperMap iClient3D for WebGL提供了自定义区域影像裁剪的方法。让我们一起看看吧&#xff01; 一、数据制作 对于上述视频中的地图制作&#xff0c;此处不做讲述&am…

STM32中使用PWM对舵机控制

目录 1、硬件JIE 2、PWM口配置 3、角度转换 4、main函数中应用 5、工程下载连接 1、硬件介绍 单片机&#xff1a;STM32F1 舵机&#xff1a;MG995 2、PWM口配置 20毫秒的PWM脉冲占空比&#xff0c;对舵机控制效果较好 计算的公式&#xff1a; PSC、ARR值的选取&#xf…

5、使用 pgAdmin4 图形化创建和管理 PostgreSQL 数据库

通过上几篇文章我们讲解了如何安装 PostgreSQL 数据库软件和 pgAdmin4 图形化管理工具。 今天我们继续学习如何通过 pgAdmin4 管理工具图形化创建和管理 PostgreSQL 数据库。 一、PostgreSQL的基本工作方式 在学习如何使用PostgreSQL创建数据库之前&#xff0c;我们需要了解一…

Protobuf原理与序列化

本文目录 1. Protobuf介绍2. Protobuf的优势3. 编写Protobuf头部全局定义消息结构具体定义字段类型定义标签号Base128编码 4. TLVProtobuf的TLV编码如何通过Varint表示300&#xff1f; 5. 编译Protobuf6. 构造消息对象 前言&#xff1a;之前写项目的时候只是简单用了下Protobuf…