我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL的覆盖索引与回表是怎样的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL的覆盖索引与回表是怎样的

今天就跟大家聊聊有关MySQL的覆盖索引与回表是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

两大类索引

使用的存储引擎:MySQL5.7 InnoDB

聚簇索引

* 如果表设置了主键,则主键就是聚簇索引  * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引  * 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引

InnoDB的聚簇索引的叶子节点存储的是行记录(其实是页结构,一个页包含多行数据),InnoDB必须要有至少一个聚簇索引。

由此可见,使用聚簇索引查询会很快,因为可以直接定位到行记录。

普通索引

普通索引也叫二级索引,除聚簇索引外的索引,即非聚簇索引。

InnoDB的普通索引叶子节点存储的是主键(聚簇索引)的值,而MyISAM的普通索引存储的是记录指针。

示例

建表

mysql> create table user(      -> id int(10) auto_increment,      -> name varchar(30),      -> age tinyint(4),      -> primary key (id),      -> index idx_age (age)      -> )engine=innodb charset=utf8mb4;

id 字段是聚簇索引,age 字段是普通索引(二级索引)

填充数据

insert into user(name,age) values('张三',30);  insert into user(name,age) values('李四',20);  insert into user(name,age) values('王五',40);  insert into user(name,age) values('刘八',10);  mysql> select * from user;  +----+--------+------+  | id | name  | age |  +----+--------+------+  | 1 | 张三  |  30 |  | 2 | 李四  |  20 |  | 3 | 王五  |  40 |  | 4 | 刘八  |  10 |  +----+--------+------+

索引存储结构

id 是主键,所以是聚簇索引,其叶子节点存储的是对应行记录的数据MySQL的覆盖索引与回表是怎样的

聚簇索引(ClusteredIndex)

age 是普通索引(二级索引),非聚簇索引,其叶子节点存储的是聚簇索引的的值

MySQL的覆盖索引与回表是怎样的

普通索引(secondaryIndex)

如果查询条件为主键(聚簇索引),则只需扫描一次B+树即可通过聚簇索引定位到要查找的行记录数据。

如:select * from user where id = 1;

MySQL的覆盖索引与回表是怎样的

聚簇索引查找过程

如果查询条件为普通索引(非聚簇索引),需要扫描两次B+树,第一次扫描通过普通索引定位到聚簇索引的值,然后第二次扫描通过聚簇索引的值定位到要查找的行记录数据。

如:select * from user where age = 30;

1. 先通过普通索引 age=30 定位到主键值 id=1  2. 再通过聚集索引 id=1 定位到行记录数据

MySQL的覆盖索引与回表是怎样的

普通索引查找过程第一步

MySQL的覆盖索引与回表是怎样的

普通索引查找过程第二步

回表查询

先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记录数据,需要扫描两次索引B+树,它的性能较扫一遍索引树更低。

索引覆盖

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

例如:select id,age from user where age = 10;

如何实现覆盖索引

常见的方法是:将被查询的字段,建立到联合索引里去。

1、如实现:select id,age from user where age = 10;

explain分析:因为age是普通索引,使用到了age索引,通过一次扫描B+树即可查询到相应的结果,这样就实现了覆盖索引

MySQL的覆盖索引与回表是怎样的

2、实现:select id,age,name from user where age = 10;

explain分析:age是普通索引,但name列不在索引树上,所以通过age索引在查询到id和age的值后,需要进行回表再查询name的值。此时的Extra列的NULL表示进行了回表查询

MySQL的覆盖索引与回表是怎样的

为了实现索引覆盖,需要建组合索引idx_age_name(age,name)

drop index idx_age on user;  create index idx_age_name on user(`age`,`name`);

explain分析:此时字段age和name是组合索引idx_age_name,查询的字段id、age、name的值刚刚都在索引树上,只需扫描一次组合索引B+树即可,这就是实现了索引覆盖,此时的Extra字段为Using index表示使用了索引覆盖。

MySQL的覆盖索引与回表是怎样的

哪些场景适合使用索引覆盖来优化SQL

全表count查询优化

mysql> create table user(      -> id int(10) auto_increment,      -> name varchar(30),      -> age tinyint(4),      -> primary key (id),      -> )engine=innodb charset=utf8mb4;

例如:select count(age) from user;

MySQL的覆盖索引与回表是怎样的

使用索引覆盖优化:创建age字段索引

create index idx_age on user(age);

MySQL的覆盖索引与回表是怎样的

列查询回表优化

前文在描述索引覆盖使用的例子就是

例如:select id,age,name from user where age = 10

使用索引覆盖:建组合索引idx_age_name(age,name)即可

分页查询

例如:select id,age,name from user order by age limit 100,2;

因为name字段不是索引,所以在分页查询需要进行回表查询,此时Extra为Using filesort文件排序,查询性能低下。

MySQL的覆盖索引与回表是怎样的

使用索引覆盖:建组合索引idx_age_name(age,name)

MySQL的覆盖索引与回表是怎样的

看完上述内容,你们对MySQL的覆盖索引与回表是怎样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL的覆盖索引与回表是怎样的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql 14 覆盖索引+回表

覆盖索引概念:    MySQL可以利用索引返回select列表中的字段值(就是索引值)。而不必根据主键再次读取聚簇索引数据文件查到数据,也就是平时所说的不需要回表操作。覆盖索引其实是索引覆盖的意思,索引字段就已经囊括select查询的字段,即索引字段覆盖了需
mysql 14 覆盖索引+回表
2020-11-10

MySQL 回表,覆盖索引,索引下推

目录回表覆盖索引索引下推无索引下推: 查看索引下推的状态有索引下推: 开启索引下推回表在研究mysql二级索引的时候,发现Mysql回表这个操作,往下研究了一下字面意思,找到索引,回到表中找数据解释一下就是:先通过索引扫描出数据所在
2022-07-11

MySQL回表查询与索引覆盖的区别

本文主要介绍了MySQL回表查询与索引覆盖的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-20

MySQL回表查询与索引覆盖的区别是什么

这篇文章主要介绍“MySQL回表查询与索引覆盖的区别是什么”,在日常操作中,相信很多人在MySQL回表查询与索引覆盖的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL回表查询与索引覆盖的区别
2023-07-05

【MySQL系列】-回表、覆盖索引真的懂吗

【MySQL系列】-回表、覆盖索引真的懂吗 文章目录 【MySQL系列】-回表、覆盖索引真的懂吗一、MYSQL索引结构1.1 索引的概念1.2 索引的特点1.3 索引的优点1.4 索引的缺点 二、B-Tree与B+Tree2.
2023-08-21

MySQL 覆盖索引的优点

一个通常的建议是为WHERE条件创建索引,但这其实是片面的。索引应当为全部查询设计,而不仅仅是WHERE条件。索引确实能有效地查找数据行,但MySQL也能够使用索引获取列数据,这样根本不需要去读取一行数据。毕竟,索引的叶子节点包含了索引对应
2022-05-30

mysql覆盖索引的优点是什么

这篇文章主要介绍了mysql覆盖索引的优点是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、优点说明(1)索引项通常比记录小,因此MySQL访问数据少。(2)索引都是按
2023-06-15

Mysql索引覆盖的实现

目录1.什么是覆盖索引2.覆盖索引为什么快3.SQL优化场景(1)无where条件(2)where条件区分度低(3)查询仅选择主键4.总结与建议1.什么是覆盖索引通常情况下,我们创建索引的时候只关注where条件,不过这只是索引优化的一个
2023-03-03

MySQL中复合索引和覆盖索引的区别详解

目录前言准备复合索引覆盖索引总结前言准备我们先准备一张表和几个字段,方便介绍覆盖索引和复合索引。创建一个user表,表中有id、name、school、age字段。字段名字段类型idintnamevarcharschoolvarcha
MySQL中复合索引和覆盖索引的区别详解
2023-11-23

mysql覆盖索引高性能的示例分析

这篇文章主要介绍mysql覆盖索引高性能的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、高性能的原因索引通常比记录要小,覆盖索引查询只需要读索引,而不需要读记录。索引都按照值的大小进行顺序存储,相比与随机
2023-06-15

如何通过索引提升PHP与MySQL的联合索引和覆盖索引查询效率?

随着互联网的发展和数据量的增加,数据库的性能优化变得越来越重要。索引是提升数据库查询性能的一种重要手段。在PHP与MySQL的应用中,通过合理使用联合索引和覆盖索引,可以大幅度提升查询效率。本文将介绍如何使用联合索引和覆盖索引进行查询优化,
2023-10-21

mysql中关于覆盖索引的知识点总结

如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引'。 覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不需要读取数据,有以下优点: 1、索引项通常比记录要小,所以MySQL访问更少的数据。 2、索引都按值得
2022-05-17

Oracle Index与数据库的索引覆盖扫描提升

Oracle Index是一种用于加快数据库查询速度的数据结构,它存储了表中某个或多个列的值及其对应的行号,以便快速定位到满足查询条件的行。索引覆盖扫描是一种利用索引提高查询性能的方法,它通过仅使用索引而不需要访问表的数据块来执行查询,从而
Oracle Index与数据库的索引覆盖扫描提升
2024-08-15

Swoole和Workerman对PHP与MySQL的索引扫描和索引覆盖查询的优化方法

引言:在大规模的Web应用中,数据库查询的性能优化是至关重要的。索引是一种非常有效的优化手段之一,可以加快查询的速度。针对PHP与MySQL的索引扫描和索引覆盖查询,本文将介绍如何使用Swoole和Workerman来进行优化,并提供具体的
2023-10-21

编程热搜

目录