首页 > 数据库 >MySQL 中的回表是什么?

MySQL 中的回表是什么?

时间:2024-12-14 22:31:31浏览次数:6  
标签:非聚 name 什么 聚簇 查询 回表 索引 MySQL 回表是

MySQL 中的回表

回表是 MySQL 查询优化中的一个概念,指的是在使用非聚簇索引查询时,无法直接从索引中获取所需的所有数据,需要通过非聚簇索引查找到主键值,然后再去聚簇索引中根据主键值获取完整数据行的过程。


1. 回表的触发条件

  • 使用了非聚簇索引(也称二级索引、辅助索引)。
  • 查询的列中有部分字段不包含在非聚簇索引的叶子节点中。
  • 查询无法通过覆盖索引优化(即查询涉及的字段不全在索引中)。

2. 回表的实现过程

假设有如下表结构和查询:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    email VARCHAR(100),
    KEY idx_name (name)
);

查询语句:

SELECT age, email FROM users WHERE name = 'Alice';

执行步骤:

  1. 扫描非聚簇索引 idx_name:
  • 在 idx_name 索引的 B+ 树中查找 name = 'Alice' 的记录。
  • 叶子节点中存储的值是主键 id。
  1. 通过主键值回表:

使用 id 到聚簇索引(主键索引)对应的 B+ 树中,找到完整的数据行。
获取 age 和 email 的值。

3. 回表的性能开销

  • 磁盘 I/O:回表可能导致多次随机磁盘读取(如果数据不在内存中)。
  • 查询延迟:需要在聚簇索引和非聚簇索引之间来回跳转,增加查询时间。

4. 如何减少回表

(1)覆盖索引

  • 定义:当查询的所有字段都包含在非聚簇索引中时,MySQL 可以直接从索引中获取数据,无需回表。

  • 优化方式:

    • 在索引中添加查询需要的字段(称为索引覆盖)。
      示例:
    CREATE INDEX idx_name_age_email ON users(name, age, email);
    

(2)减少查询列

  • 仅查询必要字段,避免不必要的列导致回表。

(3)合理设计表结构

  • 通过优化索引设计,将查询的高频字段优先纳入索引。

5. 聚簇索引与非聚簇索引的关系

  • 聚簇索引:
    • 数据和索引存储在一起,不存在回表问题。
  • 非聚簇索引:
    • 数据和索引分开存储,查询完整数据行时可能需要回表。

6. 总结

术语 描述
回表 从非聚簇索引中查询到主键值后,再访问聚簇索引获取完整数据行的过程。
触发条件 查询涉及的字段不在非聚簇索引中,或查询字段超出索引覆盖的范围。
解决方法 通过覆盖索引、减少查询列或优化表结构等方式,减少回表操作,提升查询性能。

标签:非聚,name,什么,聚簇,查询,回表,索引,MySQL,回表是
From: https://www.cnblogs.com/eiffelzero/p/18607355

相关文章

  • 【重生之我在B站学MySQL】
    MySQL笔记文章目录MySQL的三层结构SQL语句分类sql语句数据库操作创建数据库查看、删除数据库表操作创建表mysql常用数据类型(列类型)查询表、插入值创建表练习创建一个员工表emp修改表mysql约束primarykey(主键)notnull(非空)unique(唯一)foreignkey(外键)check......
  • MySQL 的存储引擎有哪些?它们之间有什么区别?
    MySQL的存储引擎及其区别MySQL提供多种存储引擎,不同存储引擎在数据存储方式、索引支持、事务处理等方面各具特点。以下列出常用的存储引擎及其主要区别。1.常见存储引擎(1)InnoDB特点:默认存储引擎,支持事务(ACID)。使用聚簇索引,主键数据和索引存储在一起。支持外键约束。......
  • MySQL 的索引类型有哪些?
    MySQL的索引类型MySQL提供多种索引类型,用于优化数据查询性能。每种索引类型在存储结构、适用场景和性能特性方面各不相同。1.常见的索引类型(1)B+树索引结构:基于B+树实现,是MySQL中最常见的索引类型。特点:索引节点按照键值从小到大顺序排列。叶子节点之间通过指针连......
  • MySQL中这14个神仙功能,惊艳到我了!!!
    大家好,我是苏三,又跟大家见面了。前言我最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。1.group_concat在我们平常的工作中,使用groupby进行分组的场景,是非常多的。比如想统计出用户表中,名称不同的用户的具体名称有哪些?......
  • USB3.2 ECN是什么
    USB3.2ECN(EngineeringChangeNotice)是一个针对USB3.2标准的技术更新和修订文件。让我详细解释一下:USB3.2标准背景USB3.2是通用串行总线(UniversalSerialBus)的一个版本,用于连接计算机和电子设备,提供数据传输和供电功能。ECN的作用ECN是一种在技术标准中用于引入小规......
  • MySQL coredump 了
    背景基础环境:操作系统:DB:RetHet 7.8存储:SSD内存:16GCPU核数:16CORE数据库环境:5.7.12事务隔离级别:RR 问题现象:应用反馈 出现了大量的数据库连接报错,之后恢复正常。MySQL日志显示数据库似乎崩溃了。排查原因1、大量数据库连接报错,根据经验第一反应是网络的问题造......
  • php毕业设计期末作业购物商城php+mysql+html在线购物系统购物商城购物网站宠物商城电
     一,功能介绍        前台主要包括网站首页、商品推荐、最新商品、新闻咨询、商品分类、商品资讯、评论、登录、注册、加入购物车、结算、个人中心等功能模块商品推荐、最新商品在商品推荐、最新商品模块,用户可以查看全部商品信息,选择商品进行添加购物车等操作,购......
  • MySQL Limit 分页查询优化
    前言在各类系统的表格类信息展示的功能中,经常会用到“翻页”这个操作,在页面上每次只展示有限的数据,需要看其他数据的时候则像翻书一样翻到后面的“页”。在MySQL支持的SQL语法中对此有特殊的支持,开发人员在实现这类功能的时候很方便:select*fromxxxlimitM,Nselect*f......
  • Python爬取数据插入mysql(简易记录)
    importmysql.connectorimportrequestsfromlxmlimporthtml#连接MySQL数据库db=mysql.connector.connect(host="?",user="?",password="?",database="?")cursor=db.cursor()company_url=......
  • mysql-搭建主从复制
    mysql-搭建主从复制Master(主):dockerrun-p3339:3306--namemaster-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.7Slave(从):dockerrun-p3340:3306--nameslave-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.7Master对外映射的端口是3339,Slave对外映射的端口是3340。因为do......