MySQL中的回表

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL中的回表




"回表"是数据库查询中的一个概念,特别是在执行查询时涉及到非聚簇索引的情况下。让我们来详细解释一下:

1、表扫描和索引:

表扫描(Table Scan):

表扫描是指数据库系统对整个表进行逐行扫描以满足查询条件。当没有适用的索引可用或查询条件无法充分利用索引时,数据库引擎可能会选择执行表扫描。表扫描有两种类型:全表扫描和局部扫描。

  1. 全表扫描(Full Table Scan):
  • 概念: 在全表扫描中,数据库按顺序读取整个表的每一行,以找到满足查询条件的记录。
  • 应用场景: 当没有可用的索引,或者对整个表的数据进行操作时,可能会执行全表扫描。
  1. 局部扫描:
  • 概念: 局部扫描是在某些条件下扫描表的一部分,而不是整个表。
  • 应用场景: 当查询条件只涉及到表的一部分数据时,数据库引擎可能会执行局部扫描以提高性能。

索引:

索引是一种数据结构,用于提高数据库系统对表中数据的检索速度。索引可以看作是表的快速查找表,允许数据库引擎更迅速地定位和访问特定值。

  1. 聚簇索引(Clustered Index):
  • 概念: 表数据的物理顺序与索引的顺序一致。InnoDB 存储引擎的主键是聚簇索引。
  • 性能优势: 在聚簇索引上的查找速度很快,因为相邻的数据通常存储在相邻的磁盘页上。
  1. 非聚簇索引(Non-clustered Index):
  • 概念: 索引和表的数据存储在不同的地方。MySQL的InnoDB引擎的非主键索引就是非聚簇索引。
  • 性能考虑: 在非聚簇索引上的查找需要进行两次查找:首先在索引中找到主键,然后使用主键再到表中查找实际数据。
  1. 索引的作用:
  • 提高检索速度: 通过使用索引,数据库引擎可以快速定位到满足查询条件的数据,而不必扫描整个表。
  • 唯一性约束: 索引可以强制表中的某一列或一组列的唯一性,确保数据的一致性。
  • 加速排序和分组操作: 在排序或分组操作中,索引可以提高性能。
  1. 索引的选择和创建:
  • 根据查询模式选择: 索引的选择应该根据查询模式和频率进行,以优化常用查询的性能。
  • 权衡空间和性能: 索引会占用额外的磁盘空间,并在写操作时有一定的开销。在设计中需要权衡空间和性能。

在设计数据库时,合理使用索引,尽量减少表扫描,对于特定查询场景使用合适的索引,可以有效提高数据库的性能。

2、聚簇索引 vs. 非聚簇索引:

聚簇索引(Clustered Index):

  1. 概念:
  • 表数据的物理顺序与索引的顺序一致。换句话说,表的数据行的存储顺序与聚簇索引的顺序相同。
  • 在 InnoDB 存储引擎中,主键是聚簇索引。如果没有显式指定主键,InnoDB 会选择一个唯一非空索引来作为聚簇索引。
  1. 性能优势:
  • 查找速度很快,因为相邻的数据通常存储在相邻的磁盘页上,减少了 I/O 操作。
  • 范围查询和排序操作的性能较好,因为相关数据行在物理上是相邻的。
  1. 空间效率:
  • 由于表的数据行的物理顺序与聚簇索引的顺序相同,不需要额外的存储空间。

非聚簇索引(Non-clustered Index):

  1. 概念:
  • 索引和表的数据存储在不同的地方,它们的物理顺序不一定一致。在 InnoDB 中,非主键索引就是非聚簇索引。
  • 非聚簇索引中的叶子节点包含指向实际数据行的指针。
  1. 性能考虑:
  • 查找时需要进行两次查找:首先在索引中找到主键值,然后使用主键值再到表中查找实际数据。因此,相对于聚簇索引,查找性能可能较慢。
  • 范围查询和排序操作的性能可能较差,因为相关数据行在物理上可能不是相邻的。
  1. 空间效率:
  • 非聚簇索引需要额外的存储空间,因为索引和实际数据存储在不同的位置。

选择索引类型的考虑:

  1. 查询模式: 根据实际查询的模式来选择索引类型。如果经常使用范围查询、排序或者特定的列查询,聚簇索引可能更适合。
  2. 唯一性: 如果需要确保某一列或一组列的唯一性,可以选择在该列上创建唯一索引,这可能是一个聚簇索引或非聚簇索引。
  3. 表的写入操作: 聚簇索引在表的写入操作(插入、更新、删除)时可能产生较大的开销,因为数据的物理顺序需要维护。非聚簇索引相对于写入操作的开销可能较小。
  4. 表的大小: 聚簇索引对小表可能更为适用,而非聚簇索引可能更适合大表。
  5. 存储引擎支持: 不同的存储引擎对于聚簇索引和非聚簇索引的支持程度可能有所不同。在选择索引类型时需要考虑使用的存储引擎。

在设计数据库时,需要根据实际应用场景和性能需求来选择合适的索引类型。

3、回表:

"回表"是数据库查询优化中的一个概念,特别是在涉及非聚簇索引的情况下。当执行查询时,如果需要检索的数据不在索引中,数据库引擎就需要通过索引中的指针回到实际数据行所在的表中进行进一步的检索,这个过程就被称为“回表”。

回表的工作流程:

  1. 索引查找: 初始查询通过索引定位到符合条件的记录。这通常是通过 B 树等数据结构实现的,能够快速定位到索引键的值。
  2. 获取指针: 在非聚簇索引中,索引的叶子节点不直接包含数据,而是包含指向实际数据行的指针。数据库引擎需要获取这个指针。
  3. 回到表中检索实际数据: 使用获取的指针,数据库引擎回到表中,找到实际的数据行,获取查询所需的列的值。

为什么发生回表:

  1. 非聚簇索引的特点: 在非聚簇索引中,索引和实际数据存储在不同的位置。因此,当查询的列不在索引中时,就需要回到实际的数据行中获取这些列的值。
  2. 覆盖索引: 如果查询的列都包含在索引中,这样的索引被称为“覆盖索引”,就不会发生回表。覆盖索引可以减少回表的需求,提高查询性能。

回表的影响:

  1. 性能影响: 回表操作会增加额外的 I/O 操作和访问实际数据行的开销,可能导致查询性能下降。
  2. 优化策略: 为了减少回表的发生,可以考虑使用覆盖索引,即在索引中包含查询所需的所有列。
  3. 查询优化: 在设计数据库表结构和选择索引时,需要根据查询模式来优化,以最小化回表的次数。

总的来说,回表是在执行查询时需要注意的一个性能方面的考虑因素。合理设计表结构、选择适当的索引,以及考虑覆盖索引的使用,都是减少回表的发生,提高查询性能的重要策略。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 关系型数据库 MySQL
MySQL的优化利器⭐️Multi Range Read与Covering Index是如何优化回表的?
本文以小白的视角使用通俗易懂的流程图深入浅出分析Multi Range Read与Covering Index是如何优化回表
|
6月前
|
存储 SQL 关系型数据库
mysql 回表的代价(InnoDB)
mysql 回表的代价(InnoDB)
|
存储 SQL 关系型数据库
【MySQL进阶-03】深入理解mysql的索引分类,覆盖索引,覆盖索引失效,回表,MRR
【MySQL进阶-03】深入理解mysql的索引分类,覆盖索引,覆盖索引失效,回表,MRR
167 0
|
存储 缓存 关系型数据库
MYSQL的覆盖索引和回表
MYSQL的覆盖索引和回表
118 0
|
6月前
|
关系型数据库 MySQL 数据库
【MySql】MySQL数据库--什么是MySQL的回表 ?
【MySql】MySQL数据库--什么是MySQL的回表 ?
125 0
【MySql】MySQL数据库--什么是MySQL的回表 ?
|
存储 关系型数据库 MySQL
【MySQL系列】-回表、覆盖索引真的懂吗
【MySQL系列】-回表、覆盖索引真的懂吗
896 1
|
存储 关系型数据库 MySQL
MySQL回表
MySQL回表(Index Lookup)是指在使用非覆盖索引进行查询时,需要通过回表操作获取完整的数据行。当查询的列不在索引中时,MySQL无法直接从索引中获取所需的数据,而是需要通过回表操作到主键索引或聚簇索引中查找完整的数据行。
231 0
|
SQL 关系型数据库 MySQL
阿里三面:MySQL回表的性能伤害有多大?
1 回表的性能消耗 无论单列索引 or 联合索引,一个索引就对应一个独立的B+索引树,索引树节点仅包含
176 0
|
存储 容灾 关系型数据库
Mysql回表与索引覆盖,联合索引问题
Mysql回表与索引覆盖,联合索引问题
130 0
Mysql回表与索引覆盖,联合索引问题
|
SQL 关系型数据库 MySQL
MySql 索引失效、回表解析
MySql 索引失效、回表解析
245 1
MySql 索引失效、回表解析