说说MySQL回表查询与覆盖索引

分析&回答

什么是回表查询?

通俗的讲就是,如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的值进行排序的,所以索引节点中存在该列中的部分值)或者根据一次索引查询就能获得记录就不需要回表,如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息,这就叫回表。

一张图看懂:

  1. 先通过普通索引定位到主键值id=5;
  2. 在通过聚集索引定位到行记录; 这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。

覆盖索引

MySQL官网:只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。

如果一个索引(如:组合索引)中包含所有要查询的字段的值,那么就称之为覆盖索引,如:

复制代码
SELECT user_name,city,age FROM user_test WHERE user_name='louxj' AND age>25;
复制代码

因为要查询的字段(user_name, city, age)都包含在组合索引的索引列中,所以就使用了覆盖索引查询,查看是否使用了覆盖索引可以通过执行计划中的Extra中的值为Using index则证明使用了覆盖索引,覆盖索引可以极大的提高访问性能。

喵呜面试助手:一站式解决面试问题,你可以搜索微信小程序 喵呜面试助手 或关注 喵呜刷题 -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

相关推荐
SkyWalking中文站4 小时前
BanyanDB 0.11.0:新特性与升级指南
数据库
₍˄·͈༝·͈˄*₎◞ ̑̑码5 小时前
MyBatis操作数据库
数据库·mybatis
刃神太酷啦7 小时前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap
丁丁点灯o7 小时前
Oracle中使用外键的场景及不适用外键的情况
数据库·oracle
天天进步20157 小时前
Pixelle-Video 源码解析 #18:声音克隆功能:参考音频如何影响解说效果?
数据库·音视频
不懂的浪漫8 小时前
ToDesk 连接 Linux 后分辨率过低的解决方法
linux·运维·数据库
布莱克6058 小时前
Redis 详解:从核心数据结构到高可用架构
数据库
冰暮流星9 小时前
mysql之左外连接与右外连接
数据库·sql
jyOverQ9 小时前
MySQL 联合索引怎么用?最左匹配原则到底是什么意思?
数据库·mysql
没文化的阿浩9 小时前
【MySQL】用户管理
android·mysql·adb