dbaplus社群 07月16日 23:25
超冷门!面试问我 SQL 回表?我瞬间懵了!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

文章探讨了MySQL数据库索引优化在面试中的常见问题,包括索引覆盖、SQL回表以及索引的最左匹配原则。通过对这些概念的深入理解,读者可以更好地优化SQL查询,提高数据库性能。文章以简洁明了的方式解释了这些关键知识点,帮助读者应对面试挑战。

💡 索引覆盖是一种优化技术,当查询所需字段都在索引中时,数据库引擎可以直接从索引获取数据,无需回表查询,从而减少I/O操作,提升查询效率。

🔍 SQL回表是指在InnoDB存储引擎中使用非聚簇索引查询时,由于索引只包含索引字段和主键,需要根据主键去聚簇索引查找完整数据行的过程。回表会增加I/O次数,可能影响查询性能。

➡️ 索引的最左匹配原则是针对复合索引而言,查询条件应从索引的最左边开始匹配。例如,对于(last_name, first_name)的复合索引,基于last_name或(last_name, first_name)的查询可以有效利用索引,而仅基于first_name的查询则无法有效利用索引。

2025-07-03 07:16 广东

现在面试问的越来越复杂了……

目录

    索引覆盖

    SQL回表

    索引的最左匹配原则


最近在看关于Mysql 的相关知识,也和现在面试的小伙伴们做了一些采访,问到了一些相关的面试题,说实话,现在面试问的是越来越复杂了,很多时候也不从基础问了,直接项目走起,然后深挖项目中的一些问题,接着就是数据库中的相关问题,今天和大家一起聊一下关于 Mysql 几个经常问,但是却让人很蒙圈的面试题。


一、索引覆盖

在面试的时候,面试官很多会提问道优化SQL,至于怎么优化,了不起就不用再继续赘述这个问题,我们往下延伸,你了解索引覆盖么?

索引覆盖(Covering Index)或称为覆盖索引,是数据库中的一种优化手段。

当我们执行一个SQL查询时,如果只需要查询某几个字段的值,并且这几个字段的数据都已经被包含在某一个索引中(而不是全表扫描),那么数据库引擎就会直接通过这个索引来取得数据,而无需再回表查询,从而大大减少了I/O操作,提高了查询效率。

索引覆盖的优点就比如有:

这个我们就牵扯到回表查询了?面试官一般就会套路的继续往下问,那你知道回表操作么?


二、SQL回表

那么什么是 SQL 回表呢?

SQL回表,在MySQL数据库特别是InnoDB存储引擎中,是一个重要的概念。

SQL回表是指在使用非聚簇索引(也称为辅助索引或二级索引)进行查询时,由于非聚簇索引中只存储了索引字段的值和对应的主键(聚簇索引)键值,因此,如果需要获取非索引列的数据,则需要根据主键(聚簇索引)中的键值去查找实际的数据行。这个过程被称为“回表”。

回表的原理

假设有一个用户表users,包含id(主键)、name和age三个字段,其中在name字段上建立了非聚簇索引。

执行查询SELECT * FROM users WHERE name='Tom'时,会发生回表。因为首先会通过name上的非聚簇索引找到满足条件的id,然后再根据这些id回到聚簇索引中查找完整的用户数据。

而查询SELECT id, name FROM users WHERE name='Tom'则不会回表,因为所需的数据都在非聚簇索引中可以找到。

而回表操作会增加I/O次数,从而可能影响查询性能。特别是在大表和复杂查询场景下,回表操作可能成为性能瓶颈。

为了减少回表操作,可以考虑将需要查询的字段加入到索引中,形成复合索引(也称为联合索引或覆盖索引)。这样,查询时就可以直接从索引中获取到需要的数据,而无需回表。

所以,建立索引的时候,我们要非常注意,并不是说索引不好,而是说要会加才可以。


三、索引的最左匹配原则

有的时候,我们建立索引大部分都不会只是单独的一个字段,所以就有了复合索引。

索引的最左匹配原则(Leftmost Prefix Rule) 主要是在使用复合索引(也称为多列索引或多字段索引)时的一个关键概念。这个原则指出,当使用复合索引进行查询时,查询条件应该尽可能地从索引的最左边开始匹配,这样索引才能被有效地使用。

当你基于复合索引进行查询时,查询条件必须包含索引的最左边的一列或多列,以便索引能够被有效地使用。例如,如果你有一个基于(last_name, first_name)的复合索引,以下查询可以有效地使用这个索引:

在创建复合索引时,列的顺序很重要。你应该将最常用于查询条件的列放在索引的最左边。例如,如果你经常基于last_name进行查询,但很少基于first_name进行查询,那么你应该创建一个基于(last_name, first_name)的索引,而不是基于(first_name, last_name)的索引。

虽然最左匹配原则是一个重要的概念,但并不意味着你必须始终遵循它。在实际应用中,你需要根据查询的需求和数据的分布来决定是否使用复合索引以及索引的列顺序。

你学会了么?

来源丨Java学习者社区

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

MySQL 索引优化 索引覆盖 SQL回表 最左匹配原则
相关文章