MySQL进阶-----SQL提示与覆盖索引

 目录

前言

一、SQL提示

1.数据准备

2. SQL的自我选择

3.SQL提示

二、覆盖索引


前言

        MySQL进阶篇的索引部分基本上要结束了,这里就剩下SQL提示、覆盖索引、前缀索引以及单例联合索引的内容。那本期的话我们就先讲解SQL提示和覆盖索引先,剩下的内容就下一期作为完结篇讲解。

一、SQL提示

1.数据准备

上一期链接MySQL进阶-----索引的语法与SQL性能分析-CSDN博客 ,下面这个表的内容均来自上一期的,可以通过上一期查看。

目前tb_user表的数据情况如下:

索引情况如下:

把上述的 index_age 这个之前测试使用过的索引直接删除。

drop index index_age on tb_user;

2. SQL的自我选择

这里我们通过案例去初步认识SQL提示(索引的使用)

A. 执行SQL : explain select * from tb_user where profession = '软件工程';

可以看出查询走了联合索引。
B. 执行SQL,创建profession的单列索引:create index index_pro on
tb_user(profession);
C. 创建单列索引后,再次执行A中的SQL语句,查看执行计划,看看到底走哪个索引。
测试结果,我们可以看到, possible_keys idx_user_pro_age_sta,idx_user_pro 这两个
索引都可能用到,最终 MySQL 选择了 idx_user_pro_age_sta 索引。这是 MySQL 自动选择的结果。
那么,我们能不能在查询的时候,自己来指定使用哪个索引呢? 答案是肯定的,此时就可以借助于MySQL的 SQL 提示来完成。 接下来,介绍一下 SQL 提示。

3.SQL提示

SQL 提示,是优化数据库的一个重要手段,简单来说,就是在 SQL 语句中加入一些人为的提示来达到优化操作的目的。
(1) use index : 建议 MySQL 使用哪一个索引完成此次查询(仅仅是建议, mysql 内部还会再次进行评估)。
explain select * from 表名字 use index(索引名字) where 条件;
(2)ignore index : 忽略指定的索引。
explain select * from 表名字 ignore index(索引名字) where 条件;
(3)  force index : 强制使用索引。
explain select * from 表名字 force index(索引名字) where 条件;

 示例演示:

A. use index
explain select * from tb_user use index(index_pro) where profession = '软件工
程';

B. ignore index
explain select * from tb_user ignore index(index_pro) where profession = '软件工
程';

C. force index
explain select * from tb_user force index(pro_age_sta) where profession =
'软件工程';

二、覆盖索引

尽量使用覆盖索引,减少 select * 。 那么什么是覆盖索引呢? 覆盖索引是指 查询使用了索引,并
且需要返回的列,在该索引中已经全部能够找到 。

 接下来,我们来看一组SQL的执行计划,看看执行计划的差别,然后再来具体做一个解析。

explain select id, profession from tb_user where profession = '软件工程' and age =
31 and status = '0' ;
explain select id,profession,age, status from tb_user where profession = '软件工程'
and age = 31 and status = '0' ;
explain select id,profession,age, status, name from tb_user where profession = '软
件工程' and age = 31 and status = '0' ;
explain select * from tb_user where profession = '软件工程' and age = 31 and status
= '0';

执行结果如下: 

从上述的执行计划我们可以看到,这四条 SQL 语句的执行计划前面所有的指标都是一样的,看不出来差异。但是此时,我们主要关注的是后面的Extra ,前面两天 SQL 的结果为 Using where; Using
Index ; 而后面两条 SQL 的结果为 : Using index condition

Extra

含义

Using where; Using

Index

查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

Using index condition

查找使用了索引,但是需要回表查询数据

因为,在 tb_user 表中有一个联合索引 idx_user_pro_age_sta ,该索引关联了三个字段
profession age status ,而这个索引也是一个二级索引,所以叶子节点下面挂的是这一行的主
id 。 所以当我们查询返回的数据在 id profession age status 之中,则直接走二级索引
直接返回数据了。 如果超出这个范围,就需要拿到主键 id ,再去扫描聚集索引,再获取额外的数
了,这个过程就是回表。 而我们如果一直使用 select * 查询返回所有字段值,很容易就会造成回表
查询(除非是根据主键查询,此时只会扫描聚集索引)。
为了大家更清楚的理解,什么是覆盖索引,什么是回表查询,我们一起再来看下面的这组 SQL 的执行过程。
A. 表结构及索引示意图:
id 是主键,是一个聚集索引。 name 字段建立了普通索引,是一个二级索引(辅助索引)。
B. 执行SQL : select * from tb_user where id = 2;
根据 id 查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
C. 执行 SQL:selet id,name from tb_user where name = 'Arm';
虽然是根据 name 字段查询,查询二级索引,但是由于查询返回在字段为 id name ,在 name 的二级索引中,这两个值都是可以直接获取到的,因为覆盖索引,所以不需要回表查询,性能高。
D. 执行 SQL:selet id,name,gender from tb_user where name = 'Arm';
由于在 name 的二级索引中,不包含 gender ,所以,需要两次索引扫描,也就是需要回表查询,性能相对较差一点。
所以这下子理解了为什么通过主键id的搜索速度回更加快了吧!下面看一个思考题:
思考题:
一张表, 有四个字段(id, username, password, status), 由于数据量大, 需要对
以下SQL语句进行优化, 该如何进行才是最优方案:
select id,username,password from tb_user where username =
'itcast';
答案: 针对于 username, password建立联合索引, sql为: create index
idx_user_name_pass on tb_user(username,password);
这样可以避免上述的SQL语句,在查询的过程中,出现回表查询。

 以上就是本期的全部内容了,加纳!

分享一张壁纸:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/589144.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scala中如何使用Jsoup库处理HTML文档?

在当今互联网时代,数据是互联网应用程序的核心。对于开发者来说,获取并处理数据是日常工作中的重要一环。本文将介绍如何利用Scala中强大的Jsoup库进行网络请求和HTML解析,从而实现爬取京东网站的数据,让我们一起来探索吧&#xf…

SWM341系列应用(上位机应用)

SWM341系列之上位机应用 1、分级图像和PNG、JPG的应用 现象:客户使用SWM34SVET6HMI_0.4.1版本上位机进行UI界面布局,反馈在模拟运行时(PC端)流畅,在Demo平台(设备端)运行卡顿。 分析及解决&…

第N6周:使用Word2vec实现文本分类

import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,pathlib,warnings #忽略警告信息 warnings.filterwarnings("ignore") # win10系统 device torch.device("cuda"if torch.cuda.is_ava…

OpenHarmony实战开发-如何通过Stage模型实现一个简单的游戏卡片

介绍 本示例展示了如何通过Stage模型实现一个简单的游戏卡片。 通过卡片支持的点击事件进行交互,让用户通过点击的先后顺序把一个乱序的成语排列成正确的成语。使用了C和TS的混合编程方式,将获取随机数的能力下沉到C实现,并通过NAPI的能力将…

动态规划详细讲解c++|经典例题讲解认识动态规划|0-1背包问题详解

引言 uu们,你们好!这次的分享是动态规划,其中介绍了动态规划的相关概念和做题模板(三要素),同时为了uu们对动态规划方法有更加形象的认识,特地找了两个经典问题,和大家一起分析。并…

数字乡村创新之路:科技引领农村实现高质量发展

随着信息技术的快速发展,数字乡村建设已成为推动农村高质量发展的重要引擎。数字乡村通过科技创新,不仅改变了传统农业生产方式,也提升了乡村治理水平,为农民带来了更加便捷的生活。本文将从数字乡村的内涵、科技引领农村高质量发…

SV学习笔记(三)

类和对象概述 类和对象 面向对象的编程语言更符号人对自然语言的理解(属性property和功能function)。 这个世界由无数的类(class)和对象(object)构成的。 类是将相同的个体抽象出来的描述方式&#xff0c…

ObjectiveC-08-OOP面向对象程序设计-类的分离与组合

本节用一简短的文章来说下是ObjectiveC中的类。类其实是OOP中的一个概念,概念上简单来讲类是它是一组关系密切属性的集合,所谓的关系就是对现实事物的抽象。 上面提到的关系包括很多种,比如has a, is a,has some等&…

Linux TCP连接数查询

1 tcp连接查看 netstat -anput 2 统计连接数 2.1统计80端口的连接数 netstat -nat|grep -i "80"|wc -l 2.2统计总连接数 netstat -nat|wc -l 2.3统计已连接上的,状态为established netstat -na|grep ESTABLISHED|wc -l 3 统计所有请求状态及数量 …

Redis 应用问题解决——缓存穿透、缓存击穿、缓存雪崩、分布式锁

缓存穿透 key对应的数据在数据源不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能…

JavaSE:抽象类和接口

目录 一、前言 二、抽象类 (一)抽象类概念 (二)使用抽象类的注意事项 (三)抽象类的作用 三、接口 (一)接口概念 (二)接口语法规则 (三&a…

Keil不能生成.bin文件,解决方法

脚本: D:\ProgramFiles\Keil_v5\ARM\ARM5.06\bin\fromelf.exe --bin --outputBin\keyboard.bin ..\..\Output\keyboard.axf 说明: fromelf.exe --bin --outputBin\keyboard.bin ..\..\Output\keyboard.axf 通过生成后的keyboard.axf, 执行f…