【MySQL】一篇讲懂什么是聚簇索引和非聚簇索引(二级索引)以及什么是回表?

embedded/2025/3/26 4:11:44/

1.聚簇索引:

叶子节点直接存储了完整的数据行。

  • 每个表只能有一个聚簇索引,通常是主键(Primary Key)。
  • 如果没有定义主键,则MySQL会选择一个唯一且非空索引作为聚簇索引。

特点:

  • 数据存储:叶子结点存储完整的数据行,因此数据和索引是存储在一起的。
  • 查询效率:一次索引查询就能查到完整数据航。
  • 排序:数据在物理上时按照聚簇索引的顺序存储的,因此范围查询非常(BETWEEN、>、<)高效。

举例:
请添加图片描述

2.非聚簇索引(也叫二级索引):

叶子节点存储的是 索引字段的值+主键值,而不是完整的数据行。

  • 一个表可以有多个非聚簇索引。
  • 非聚簇索引需要通过主键值 回到聚簇索引中查找完整的数据行,这个过程称为回表(下面详细介绍)。

特点:

  • 数据存储:叶子结点存储的是 索引字段值+主键值。而不是完整的数据行。
  • 查询效率:通过非聚簇索引查找数据需要两次查找:1.通过非聚簇索引找到主键值。2.通过主键值回到聚簇索引中查找完整的数据行。
  • 使用场景:适合查找条件中不包含主键的场景。

举例:
请添加图片描述

  • 步骤1:通过非聚簇索引idx_name找到name='Bob’对应的主键值id=2
  • 步骤2:通过主键值id=2回到聚簇索引中查找完整的数据行,返回id=2,name=‘Bob’,age=30。

优缺点:

  • 优点

    • 提高查询效率:加速基于非主键字段的查询。
    • 支持多字段索引,可以创建联合索引。
  • 缺点

    • 占用存储空间:每个二级索引都要额外的存储空间。
    • 可能触发回表:如果查询字段不在二级索引中,需要回表,增加查询开销。

3.回表:

回表 是指 当用二级索引查询数据时,如果查询的字段不在二级索引中,MySQL需要通过二级索引找到主键值,然后再回到聚簇索引中查找完整的数据行。

4.为什么会出现回表?

通常发生在一下场景:
1.查询的字段不在二级索引中

  • 例如,select * 需要获取所有字段,但二级索引只包含部分字段(如name和id),因此需要回表。
    2.使用了ORDER BY或GROUP BY
  • 如果排序或分组的字段不在二级索引中,可能需要回表来获取完整的数据行。

5.如何避免回表?

5.1使用覆盖索引:

覆盖索引:查询的字段都在二级索引中,可以直接从二级索引中获取数据,而不需要回表。

SELECT id, name FROM users WHERE name = 'Alice';

id 和 name 都在二级索引 idx_name 中,因此不需要回表。

5.2优化索引设计

确保常用的查询字段都在索引中。

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(100),age INT,KEY idx_name_age (name, age)  -- 联合索引
);

如果查询name和age,可以使用联合索引,避免回表。

5.3减少SELECT *的使用


http://www.ppmy.cn/embedded/176690.html

相关文章

docker 容器 php环境中安装gd 、mysql 等扩展

1、先配置阿里云镜像源 cd /etc/apt echo "" > sources.list echo "deb http://mirrors.aliyun.com/debian/ bullseye main contrib" >> /etc/apt/sources.list echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main contrib&q…

MySQL中DDL、DML、DQL、DCL四种语言详细介绍

对比&#xff1a; 分类英文全称中文全称作用常见命令DDLData Definition Language数据定义语言定义和修改数据库结构CREATE, DROP, ALTER, TRUNCATEDMLData Manipulation Language数据操作语言操作表中的数据&#xff08;增、删、改&#xff09;INSERT, UPDATE, DELETEDQLData…

【SpringCloud】微服务的治理以及服务间的远程调用

目录 一、微服务的诞生 二、服务注册和发现 2.1 需求的产生 2.2 注册中心原理 2.3 Nacos注册中心 2.4 Nacos安装部署教程 2.5 配置Nacos 三、OpenFeign 3.1 认识OpenFeign 3.2 快速入门 3.2.1 引入依赖 3.2.2 启动OpenFeign 3.2.3 编写OpenFeign客户端 3.2.4 使…

什么是TCP,UDP,MQTT?

以下内容来源于抖音,作者织点代码,读者根据文章内容以及相应论文添加自己的理解进行注释。 计算机之间怎么通信? 彼此之间用网线连接在一起就可以了 但是这样子太麻烦了,成本太高,操作也麻烦 集线器 于是我们可以把线拧在一起 而拧在一起的这个设备,就是集线器 但集线…

【程序人生】成功人生架构图(分层模型)

文章目录 ⭐前言⭐一、根基层——价值观与使命⭐二、支柱层——健康与能量⭐三、驱动层——学习与进化⭐四、网络层——关系系统⭐五、目标层——成就与财富⭐六、顶层——意义与传承⭐外层&#xff1a;调节环——平衡与抗风险⭐思维导图 标题详情作者JosieBook头衔CSDN博客专家…

Four.meme是什么,一篇文章读懂

一、什么是Four.meme&#xff1f; Four.meme 是一个运行在 BNB 链的去中心化平台旨在为 meme 代币供公平启动服务。它允许用户以极低的成本创建和推出 meme 代币&#xff0c;无需预售或团队分配&#xff0c;它消除了传统的预售、种子轮和团队分配&#xff0c;确保所有参与者有…

常见框架漏洞:Thinkphp(TP)篇

简介 ThinkPHP&#xff08;简称 TP&#xff09;是一款流行的 国产开源 PHP 框架&#xff0c;遵循 MVC&#xff08;Model-View-Controller&#xff09; 设计模式&#xff0c;以简洁、高效、灵活著称&#xff0c;广泛应用于国内中小型 Web 项目开发。 Thinkphp5x远程命令执行及g…

本地部署 LangManus

本地部署 LangManus 0. 引言1. 部署 LangManus2. 部署 LangManus Web UI 0. 引言 LangManus 是一个社区驱动的 AI 自动化框架&#xff0c;它建立在开源社区的卓越工作基础之上。我们的目标是将语言模型与专业工具&#xff08;如网络搜索、爬虫和 Python 代码执行&#xff09;相…