MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

MYSQL 回表、索引覆盖、 索引下推[通俗易懂]1.索引种类创建数据表&插入数据createtableuser(idint(10)auto_increment,namevarchar(30),agetinyint(4),primarykey(id),indexidx_age(age)USINGBTREE)engine=innodbcharset=utf8mb4;insertintouser(name,age)values(‘张三’,30),

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1. 索引种类

创建数据表& 插入数据

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


insert into user(name,age) values
('张三',30),
('李四',20),
('王五',40),
('刘八',10);

聚簇索引

每个 INNODB 表 都会有一个聚簇索引 创建规则如下:

* 如果表设置了主键,则主键就是聚簇索引

* 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引

* 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引

聚簇索引整体是一个B+树,非叶子节点存放的是键值,叶子节点存放的是行数据,称之为数据页,这就决定了表中的数据也是聚簇索引中的一部分,数据页之间是通过一个双向链表来链接

数据存储结构简图:

MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

普通索引

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

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

MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

 2. 回表查询

执行下面sql查询

select id,name from user where age = 10;

分析查询过程,  首先通过普通索引(age) 定位 age = 10 的ID 然后通过聚集索引 查询select 字段返回结果集 , 此过程 需要扫描两次索引B+树,它的性能较扫一遍索引树更低。

3. 索引覆盖

执行下面sql查询

select id,age from user where age = 10;

可通过普通索引列(age) 就能获取SQL所需的所有列数据,无需回表,速度更快。

explain 分析:

MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

 可通过Extra 是否是Using Index 判断查询是否索引覆盖

如何实现索引覆盖: 

将被查询的字段,建立到联合索引里去

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

  • 全表count查询优化 
  • 列查询回表优化

  • 分页查询

4. 索引下推

在上面数据表的基础上 添加复合索引 

 index idx_age_name (age,name)

执行下面sql查询,分析查询过程

select id,age from user where name like '张%' and age = 20;

Mysql版本 < 5.6

检索复合索引 idx_name_age  查询出所有 name 包含 “张” 的主键ID 然后通过聚簇索引判断出所有符合where子句的数据返回 ,此过程需要回表

Mysql版本 >= 5.6

检索复合索引 idx_name_age  查询所有 name 包含 “张” 的 且age =20 的数据 直接返回结果集, 无需回表

可见 索引下推在非主键索引上的优化,可以有效减少回表的次数,大大提升了查询的效率

explain 分析:

MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

 Using Index Condition  使用了索引下推的表现

end!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189550.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 逻辑回归模型_RF模型

    逻辑回归模型_RF模型背景:在“批量导入数据到Redis”中已经介绍了将得到的itema item1:score1,item2:score2…批量导入到Redis数据库中。本文的工作是运用机器学习LR技术,抽取相应的特征,进行点击率的估计。点击率(Click-Through-Rate,CTR)预估点击率(predictCTR,pCTR)是指对某个系统将要在某个情形下展现前,系统预估其可能的点击概率…

    2022年10月13日
  • 网页内容变化监控提醒

    网页内容变化监控提醒有很多的人都需要查看网站的变化并且提醒,比如说股票的股市,商品的价格等等。这次案例以实时监控天气温度来简要的说明监控方法,监控的时广州的实时气温,网站会不断的更新当前的气温。首先打开软件网页自动操作通用工具PageOperator,在任务菜单中新建一个刷新操作。点击添加按钮,并把网址输入到对应的地方。点击自动获取,获取网站的编码方案,点击添加,…

  • Java发送邮件换行问题

    Java发送邮件换行问题利用用java编写的发送邮件要使用来实现换行,在邮件中内容自动实现换行而不能使用一般的\n,或者\r\n

  • SQL 开发任务超 50% !滴滴实时计算的演进与优化

    SQL 开发任务超 50% !滴滴实时计算的演进与优化摘要:ApacheFlink是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态计算。可部署在各种集群环境,对各种大小的数据规模进行快速…

  • java saxreader_java解析XML文件—SAXReader

    java saxreader_java解析XML文件—SAXReaderDOM4j读取XML文件(SAXReader)一、总结:Documentdocument=newSAXReader.reader(“xml文路径/文件名xxx.xml”);//得到Document对象Elementroot=document.getRootElement()//获得根节点Iteratoriterator=root.elementIterator();//从根节点遍历子…

  • java.lang.noclassdeffounderro_cannot resolve reference to bean

    java.lang.noclassdeffounderro_cannot resolve reference to bean1.首先创建项目选择版本号跟要导入的包创建项目之后,导包的时候出现了问题找了半天问题我发现是spring-cloud-starter-netflix-eureka-server默认的版本号太高,然后去Maven仓库换了个版本低的,就是下面这个<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netfl

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号