沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • 基础

  • Mysql

    • MySQL基础小结
    • 索引篇
    • 讲讲回表查询
      • 1. 回表查询的定义
      • 2. MySQL 索引的两种类型
        • 2.1 聚簇索引(Clustered Index)
        • 2.2 辅助索引(Secondary Index)
      • 3. 回表查询的执行流程
      • 4. 回表查询的案例
        • 执行过程:
      • 5. 覆盖索引避免回表
      • 6. 回表查询的性能影响
      • 7. 优化回表查询的策略
        • 7.1 使用覆盖索引
        • 7.2 减少查询字段
        • 7.3 限制返回行数
        • 7.4 检查索引选择
      • 8. 总结
    • 讲讲索引失效问题
    • 思维导图
    • 数据库优化
    • 临时表
    • 实战篇

    • 读高性能MySQL笔记

  • Redis

  • 达梦数据库

  • 数据库
  • Mysql
沉梦听雨
2025-01-13
目录

讲讲回表查询

# 讲讲回表查询

在 MySQL 中,“回表查询” 是一个重要的性能优化相关概念,通常与 索引 的使用密切相关。理解回表查询的原理有助于更好地设计数据库索引结构,提升查询性能。以下是详细讲解:

# 1. 回表查询的定义

回表查询是指在使用非覆盖索引的查询中,MySQL 在通过索引获取主键值后,需要回到表中(聚簇索引或数据页)查找完整的行数据。

回表查询的触发场景:

  • 查询的字段中不全是索引列(例如有非索引字段)。
  • 使用了普通索引(Secondary Index),但最终需要获取完整的行数据。

# 2. MySQL 索引的两种类型

# 2.1 聚簇索引(Clustered Index)

  • 作用:MySQL InnoDB 存储引擎的主键索引是聚簇索引,数据行直接存储在叶子节点上。

  • 特点:

    • 通过主键查询不需要回表,因为主键索引直接包含了完整行数据。
  • 二级索引(非主键索引)存储的叶子节点中包含主键值,而不是行数据。

# 2.2 辅助索引(Secondary Index)

  • 作用:辅助索引用于加速查询,但其叶子节点只存储索引列和对应的主键值。
  • 回表发生:通过辅助索引查找后,若查询字段超出索引列,则需要通过主键值回到聚簇索引查找完整行数据。

# 3. 回表查询的执行流程

以下是 MySQL 查询中回表的典型过程:

  1. 选择索引:查询优化器决定使用某个二级索引。
  2. 索引扫描:根据二级索引查找满足条件的记录,得到主键值。
  3. 回表操作:根据主键值,访问聚簇索引或数据页获取完整行数据。
  4. 返回结果:将完整行数据返回给客户端。

# 4. 回表查询的案例

假设有如下表结构:

CREATE TABLE users (
    id INT PRIMARY KEY,         -- 主键
    name VARCHAR(100),          -- 普通字段
    email VARCHAR(100),         -- 索引字段
    age INT                     -- 普通字段
) ENGINE=InnoDB;

CREATE INDEX idx_email ON users(email);
1
2
3
4
5
6
7
8

查询示例:

SELECT name, age FROM users WHERE email = 'test@example.com';
1

# 执行过程:

  1. email 列上有辅助索引 idx_email,优化器会选择该索引加速查询。
  2. 在 idx_email 中找到 email = 'test@example.com' 对应的主键值。
  3. 通过主键值回到聚簇索引中读取完整的行数据。
  4. 提取 name 和 age 返回结果。

# 5. 覆盖索引避免回表

覆盖索引是指查询的所有字段都能通过索引直接获取,无需回表。

改造上面的案例:

CREATE INDEX idx_email_name_age ON users(email, name, age);
1

改造后的查询:

SELECT name, age FROM users WHERE email = 'test@example.com';
1

执行过程:

  1. 查询所需的字段 (email, name, age) 已全部包含在索引 idx_email_name_age 的叶子节点中。
  2. 直接从索引获取数据,无需回表。

优点:

  • 避免了回表操作,提升查询效率。
  • 减少磁盘 IO 和资源消耗。

# 6. 回表查询的性能影响

  • 回表次数:回表次数与查询结果的匹配行数成正比,匹配行越多,回表成本越高。
  • 随机 IO:回表需要通过主键值随机访问聚簇索引,对磁盘 IO 造成较大压力。
  • 性能瓶颈:回表查询可能成为性能优化的重点,特别是高并发环境下。

# 7. 优化回表查询的策略

# 7.1 使用覆盖索引

  • 尽量设计查询字段所需的索引,避免回表。

  • 例如:

    CREATE INDEX idx_email_name_age ON users(email, name, age);
    
    1

# 7.2 减少查询字段

  • 仅查询必要的字段,避免因多余字段触发回表。

# 7.3 限制返回行数

  • 使用 LIMIT 限制返回的记录数量,减少回表的总次数。

  • 例如:

    SELECT name FROM users WHERE email LIKE 'test%' LIMIT 10;
    
    1

# 7.4 检查索引选择

  • 确保优化器选择了最佳索引,使用 EXPLAIN 分析查询计划。

# 8. 总结

回表查询是 MySQL 查询优化中的关键知识点,它的发生主要取决于索引设计与查询字段的匹配程度。通过合理设计覆盖索引、精简查询字段、优化索引结构,可以有效降低回表查询的次数,从而提升数据库性能。

上次更新: 2025/2/12 16:35:19
索引篇
讲讲索引失效问题

← 索引篇 讲讲索引失效问题→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式