什么是覆盖索引?

简介: 本章主要讲解了索引覆盖和回表的相关知识

一、覆盖索引

select 的数据列只用从索引中就能够取得,不需要回表进行二次查询,也就是说查询列要被所使用的索引覆盖。对于 innodb 表的二级索引,如果索引能覆盖到查询的列,那么就可以避免对主键索引的二次查询。

不是所有类型的索引都可以成为覆盖索引。覆盖索引要存储索引列的值,而哈希索引、全文索引不存储索引列的值,所以MySQL使用b+树索引做覆盖索引。

对于使用了覆盖索引的查询,在查询前面使用 explain ,输出的extra列会显示为 using index

比如 user_like 用户点赞表,组合索引为 (user_id, blog_id) user_id blog_id 都不为null

explain 结果的 Extra 列为 Using index ,查询的列被索引覆盖,并且where筛选条件符合最左前缀原则,通过索引查找就能直接找到符合条件的数据,不需要回表查询数据。

explain select blog_id from user_like where user_id = 13;

explain select user_id from user_like where blog_id = 1;

explain 结果的 Extra 列为 Using where; Using index , 查询的列被索引覆盖,where筛选条件不符合最左前缀原则,无法通过索引查找找到符合条件的数据,但可以通过索引扫描找到符合条件的数据,也不需要回表查询数据。

二、回表

通俗来说

通俗的讲就是,如果select所需获得列中有非索引列,一次索引查询不能获取所有信息,需要到表中找到相应的列的信息。这就叫回表。也就是说,需要从辅助索引(Secondary Index)中获取额外的数据列,需要通过辅助索引回到主键索引(Primary Index)中进行查找。

而如果根据一次索引查询就能获得所有列信息,就不需要回表。

具体定义

当执行一个查询语句,包含了辅助索引的列时,MySQL会首先使用辅助索引定位到符合条件的记录的主键值,然后再根据这些主键值去主键索引查找对应的完整数据行。这个过程就被称为回表。


相关文章
|
8月前
|
消息中间件 NoSQL Java
拒绝频繁写库!SpringBoot 整合 BufferTrigger 实现高性能“流量聚合”
本文介绍如何用SpringBoot整合BufferTrigger实现高性能流量聚合,解决高并发下频繁写库的痛点。通过快手开源的BufferTrigger组件,可将大量数据库操作合并为批量执行,显著提升I/O效率,适用于计数、埋点、状态同步等场景,兼具高性能与低延迟。
657 145
|
人工智能 JavaScript Java
【SpringAIAlibaba新手村系列】(1)初识 Spring AI Alibaba 框架
本文介绍了SpringAIAlibaba框架的基本概念和使用方法。作为Spring官方AI框架的阿里云实现版本,它简化了Java开发者调用AI模型的过程。文章详细讲解了核心概念如ChatModel、ChatClient,以及阿里云百炼平台的功能。通过HelloWorld项目示例,展示了如何配置APIKey、编写控制层代码,实现普通调用和流式输出两种AI交互方式。重点阐述了SpringAI与SpringAIAlibaba的关系,以及自动配置机制的工作原理,帮助开发者快速上手这一框架。
7129 8
|
11月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
2989 0
|
SQL 关系型数据库 MySQL
详解MySQL覆盖索引、索引下推
1.覆盖索引 1.1.概述 覆盖索引,是为了避免“回表查询”,从而降低查询耗时的一种使用索引的方法,所以要聊覆盖索引首先我们要知道什么是"回表查询,“回表查询”是因为MySQL的索引结构决定的,是因为非聚集索引要找聚集索引拿数据而出现的现象,所以我们又要先了解MySQL中的聚集索引和非聚集索引。 文章的脉络就是先聊聚集索引、非聚集索引是怎么带来了“回表查询”的问题,然后怎么用用覆盖索引解决这个问题。
2684 0
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
2396 24
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
存储 SQL 索引
什么叫覆盖索引
覆盖索引是指只需要在一棵索引树上就能获取SQL所需的所有列数据 , 因为无需回表查询效率更高 实现覆盖索引的常见方法是:将被查询的字段,建立到联合索引里去。 执行如下查询语句 : select name,age from user where name='Alice' 因为要查询 name和 age二个字段 , 那么我们可以建立组合索引 create index index_name_age on user(name,age) 那么索引存储结构如下 : 这种情况下, 执行select name,age from user where name='Alice' , 会先根据name='Ali
|
存储 安全 Java
synchronized原理详解(通俗易懂超级好)
当系统检查到锁是重量级锁之后,会把等待想要获得锁的线程进行阻塞,被阻塞的线程不会消耗cpu。但是阻塞或者唤醒一个线程时,都需要操作系统来帮忙,这就需要从用户态转换到内核态,而转换状态是需要消耗很多时间的,有可能比用户执行代码的时间还要长。
synchronized原理详解(通俗易懂超级好)
|
NoSQL Redis 数据库
SpringCloud 分布式锁的多种实现(一)
SpringCloud 分布式锁的多种实现
905 0
SpringCloud 分布式锁的多种实现(一)
|
算法 前端开发