当前位置: 首页 > news >正文

mysql-执行计划

1. 执行计划表概述

id相同表示加载表的顺序是从上到下。
id不同id值越大,优先级越高,越先被执行。id有相同,也有不同,同时存在。
id相同的可以认为是一组,从上往下顺序执行;在所有的组中,id的值越大,优先级越高,越先执行。
ID为NULL、最后执行【一般出现在UNION场景】
在这里插入图片描述

1.1 Explain 执行计划表TYPE列

表的关联类型、比如索引扫描、全表扫描
TYPE列的枚举类型的效率:system > const > eq_ref > ref > rang > index > all
PS:如果你的SQL 查询范围 rang 的时候,已经是红线
交易型系统,到了ref就是红线。

1.2 TYPE列的枚举类型

system 表里只有一条匹配的数据 、代表系统表,一般不怎么出现
const 表里只有一条匹配的数据 、性能非常高。(主键索引和唯一键索引的常量等于查询)
eq_ref 最多只返回一条符合的记录,主键索引和唯一键索引所有关键字被连接使用
ref 普通索引的等值查询、唯一索引的部分前缀查询。可能找到多个符合条件的结果
rang 索引的范围查询、使用一个索引来检索给定的范围行
index 全索引扫描
all 全表扫描

1.3 Explain 执行计划表POSSIBLE_KEYS列

查询可能使用哪些索引
POSSIBLE_KEYS为NULL是如何处理
KEY 列有索引 实际使用的索引是以KEY列为准的 (可以不处理)
KEY 列为NULL
表的数据量很少、全表扫描 (可以不处理)
表的数据量很多、全表扫描(索引优化、SQL优化)

1.4 Explain 执行计划表KEY列

MySQL 查询实际使用的索引
如果MySQL没有使用索引,这一列为NULL。在实际的MySQL 生产调优过程中,尽量不要使用 force index	ignore index
原因1 :高耦合的编程方式、数据库索引出现变更会引发未知的错误。
原因2: 数据库表的数据是实时变化的,强制索引可能在数据量变更阶段出现非最优情况。
例:
1	-- 显示orders表所有的索引
2	show index from orders ;
3	-- force index 强制使用某个索引
4	explain select order_id from orders force index(xxx);
5	-- ignore index忽略某个索引
6	explain select order_id from orders ignore index(xxx);

1.5 Explain 执行计划表KEY-LEN列

MySQL 查询使用了索引的字节数。可以通过字节数判断使用了索引的那些列。
1	-- KEY-LEN = 16 代表16个字节
2	-- 8bit = 一个字节
3	-- 8个字节 = 64bit = 64位字符串类型
char(n) :n字节长度
varchar(n) :2字节字符的长度。UTF-8编码 3n+2整形
int 4字节
bigint 8字节
smallint 2字节
tinyint 1字节时间类型
date 3字节
datatime 8字节
timestamp 4字节
NULL 1字节

1.6 Explain 执行计划表REF列

该列显示哪些列将与列中命名的索引进行比较
查询索引对应的列。常见的值 NULL、表的列名。

1.7 rows

该列表示MySQL认为执行查询必须检查的行数

1.8 filtered

该列指示按表条件筛选的表行的估计百分比。最大值是100,这意味着没有对行进行过滤

1.9 Explain 执行计划表EXTRA列

这一列包含关于MySQL如何解析查询的附加信息。对于不同值的描述
1) Using Index
-- 使用了覆盖索引 【索引列包含了查询的所有字段】
-- 不需要回表2) Using Where 使用where条件过滤
-- 情况一 全表扫描 比如Where条件是非索引列
-- 情况二 Where条件是索引的前导列范围查询 + 一般返回的结果集非常大-3) Using Where Using Index
-- 不需要回表
-- 使用了覆盖索引 【索引列包含了查询的所有字段】
-- 情况一 Where条件是索引列之一,但是非索引的前导列
-- 情况二 Where条件是索引的前导列范围查询 + 一般返回的结果集非常大4)  -- Using Index Condition
-- 使用了索引查询、需要回表
-- 查询列无索引覆盖,Where条件是索引的前导列范围查询 数据量要少
-- 如果数据量多了,会退化为Using Where5)  -- Using Temporary 使用临时表来处理查询 【优化点 索引的优化】6)  Using filesort 使用外部索引对查询排序 【优化点 索引的优化】

2. select_type

https://dev.mysql.com/doc/refman/8.0/en/explain-output.html
在这里插入图片描述

3. mysql索引优化

3.1 全值匹配

1	-- 全值匹配 使用等于号
2	-- 希望全值匹配可以走索引 减少全表扫描
PS: show  index from index_name查看索引列

3.2 最左前缀匹配

在复合索引(多个列的索引),查询条件使用索引列从左到右的顺序进行查询。比如索引三列 (a , b , c )。
select * from t where a = ? -- 使用索引
select * from t where a = ? and b = ? -- 使用索引
select * from t where b = ? and a = ? -- 使用索引
select * from t where a = ? and b = ? and c = ? -- 使用索引
select * from t where b = ? and c = ? -- 不使用索引
select * from t where c = ? -- 不使用索引
最左前缀匹配的原因 ·(关键字)是按照创建索引的列的顺序排布的。

3.3 函数操作

查询条件列进行函数处理会导致索引的失效
查询条件的索引列禁止使用函数建议通过转化的方式来进行优化
比如 取整=1 的操作 可以化为	1<= 索引列 < 2字符串函数 列的截取、计算列的字符串长度取整、取模操作时间、日期格式转成字符串

3.4 覆盖索引

索引列包含了查询列称作覆盖索引。使用覆盖索引可以避免回表。第一 建议使用覆盖索引来优化查询
第二 不能为了覆盖索引而创建多列索引 【组合索引的列不要超过三列】
不要创建全表列的索引 , 全表列索引属于无效索引,和表几乎等价,浪费写入性能全表列索引等价于 select distinct * from orders;

3.5 不等于匹配

-- 不等于匹配效率很低,有可能退化为全表扫描
-- 避免使用不等于匹配
-- 业务系统需要考虑下

3.6 空匹配

-- key is null 不会使用索引
-- key is not null 不会使用索引
-- 建表的标准 所有的表字段非空
-- 避免使用空值匹配

3.7 LIKE匹配

1	-- 模糊匹配原则 左前缀使用索引(退化为索引的范围查询或全表扫描),其它的匹配方式索引失效(退化为全表扫描)
2	-- sql模糊匹配 符号$ * %

3.8 类型转换

1  --查询条件使用的类型和索引列原类型不一样,存在隐式类型转换。有可能导致索引失效。-- 优化原则
-- 要求条件查询列的类型和索引列的类型一致。
-- 如果不一致,不要转化索引列,而要将查询条件的类型转化为和索引列一致的类型

MySQL索引优化小结

索引列的数据长度越少越好
索引的数量不是越多越好(写入性能差)、越全越好(索引和表几乎等价)
条件查询推荐使用全值匹配
多列索引推荐使用最左前缀匹配
避免在索引列使用函数操作,会导致索引失效
建议指定查询列(优先使用覆盖索引),禁止使用 SELECT *
避免使用不等于匹配、避免使用or连接条件、避免在Where 条件中使用 NOT IN
避免使用NULL、NOT NULL 匹配、推荐所有的表列是非空的
LIKE 模糊匹配建议使用最左前缀匹配 (like 'ABC%')
推荐查询条件列的类型和索引列的类型一致,避免对索引列进行类型转换
排序的时候,优先使用索引列排序【索引列天然是排序的、排序遵循最左前缀匹配原则order by a】

相关文章:

mysql-执行计划

1. 执行计划表概述 id相同表示加载表的顺序是从上到下。 id不同id值越大&#xff0c;优先级越高&#xff0c;越先被执行。id有相同&#xff0c;也有不同&#xff0c;同时存在。 id相同的可以认为是一组&#xff0c;从上往下顺序执行&#xff1b;在所有的组中&#xff0c;id的值…...

金蝶云星空和旺店通·企业奇门接口打通对接实战

金蝶云星空和旺店通企业奇门接口打通对接实战 接入系统&#xff1a;金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff0c;旨在…...

在服务器上使用nginx改变前端项目请求的url

location /app-dev {rewrite ^/app-dev/(.*) /$1 break;proxy_pass http://152.136.36.251:9999;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr; } location /请求后缀 { rewrite ^/app-dev/(.*) /$1 break; proxy_pass 想要的请求后端的url; …...

【学习笔记】莫比乌斯反演

退役OIer回来受虐啦 一些定义 μ ( x ) { 1 x > 1 ( − 1 ) n x ∏ i 1 n P i 0 o t h e r w i s e \mu(x) \begin{cases} 1 & x > 1 \\ (-1)^n & x \prod _ {i1} ^ {n} P_{i}\\ 0 & otherwise \end{cases} μ(x)⎩ ⎨ ⎧​1(−1)n0​x>1x∏i1n​Pi…...

一款构建Python命令行应用的开源库

1 简介 当我们编写 Python 程序时&#xff0c;我们经常需要与用户进行交互&#xff0c;接收输入并输出结果。Python 提供了许多方法来实现这一点&#xff0c;其中一个非常方便的方法是使用 typer 库。typer 是一个用于构建命令行应用程序的 Python 库&#xff0c;它使得创建命令…...

10-Node.js模块化

01.模块化简介 目标 了解模块化概念和好处&#xff0c;以及 CommonJS 标准语法导出和导入 讲解 在 Node.js 中每个文件都被当做是一个独立的模块&#xff0c;模块内定义的变量和函数都是独立作用域的&#xff0c;因为 Node.js 在执行模块代码时&#xff0c;将使用如下所示的…...

数字IC前端学习笔记:数字乘法器的优化设计(Dadda Tree乘法器)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 华莱士树仍然是一种比较规则的结构&#xff08;这使得可以方便地生成树的结构&#xff09;&#xff0c;这导致了它所使用的全加器和半加器个数不是最少的&#xff…...

计算机专业毕业设计项目推荐14-文档编辑平台(SpringBoot+Vue+Mysql)

文档编辑平台&#xff08;SpringBootVueMysql&#xff09; **介绍****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&#xff0c;在编写的…...

【读书后台管理系统】—后端框架搭建(二)

【读书后台管理系统】—后端框架搭建&#xff08;二&#xff09; 一、 Node 简介 Node 是一个基于 V8 引擎的 Javascript 运行环境&#xff0c;它使得 Javascript 可以运行在服务端&#xff0c;直接与操作系统进行交互&#xff0c;与文件控制、网络交互、进程控制等 Chrome …...

【DLoopDetector(C++)】DBow2词袋模型loop close学习

0.前言 最近读了两篇论文&#xff0c;论文作者开源了一种基于词袋模型DBoW2库的DLoopDetector算法&#xff0c;自己运行demo测试一下 对应论文介绍&#xff1a;Bags of Binary Words for Fast Place Recognition in Image Sequences 开源项目Github地址&#xff1a;https://gi…...

什么是CAS机制?

CAS和Synchronized的区别是什么&#xff1f;适合什么样的场景&#xff1f;有什么样的优点和缺点&#xff1f; 示例程序&#xff1a;启动两个线程&#xff0c;每个线程中让静态变量count循环累加100次。 public class ThreadTest {private static int count 0;public static …...

Java多态详解

下面讲解一下Java中的多态机制&#xff0c;力求用最通俗易懂的语言&#xff0c;最精炼的话语&#xff0c;最生动的例子&#xff0c;深入浅出Java多态&#xff0c;帮助读者轻松掌握这个知识点。 什么是多态&#xff1f; 多态是指同一种行为具有多个不同表现形式的能力。 多态…...

Android中简单实现Spinner的数据绑定

Android中简单实现Spinner的数据绑定 然后声明对象实例并加入到arraylist里面,并设置spinner的适配器 Spinner Sp (Spinner).............// List<CItem > lst new ArrayList<CItem>(); CItem ct new CItem ("1","测试"); lst.Add(ct)…...

【版本控制工具二】Git 和 Gitee 建立联系

文章目录 前言一、Git 和 Gitee 建立联系1.1 任意目录下&#xff0c;打开 git bash 命令行&#xff0c;输入以下命令生成公钥1.2 配置SSH公钥1.3 进行全局配置 二、其它相关Git指令2.1 常用指令2.2 指令操作可能出现的问题 三、补充3.1 **为什么要先commit&#xff0c;然后pull…...

最新AI智能创作系统ChatGPT商业源码+详细图文搭建部署教程+AI绘画系统

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…...

【算法与数据结构】--目录

第一部分&#xff1a;算法基础 第一章&#xff1a;算法入门第二章&#xff1a;数据结构概述第三章&#xff1a;算法设计与分析 3.1 贪心算法3.2 动态规划3.3 分治算法3.4 回溯算法 第二部分&#xff1a;常见数据结构 第四章&#xff1a;数组和链表 4.1 数组4.2 链表4.3 比较…...

爱普生LQ1900KIIH复位方法

爱普生EPSON 1900KIIH是一部通用针式打印机&#xff0c;136列&#xff08;10cpi下&#xff09;的打印宽度&#xff0c;缓冲区128KB&#xff0c;打印速度为270字/秒。 打印机类型 打印方式&#xff1a;24针击打式点阵打印、打印方向&#xff1a;双向逻辑查找、安全规格标准&am…...

字段位置顺序对值的影响

Unity中验证AB加载场景时报错&#xff1a; Cannot load scene: Invalid scene name (empty string) and invalid build index -1 报错原因是因为把字段放在了Start函数后面(图一)改成(图二)就好了。图一中协程使用的sceneBName字段值为null。 图一&#xff1a; 图二&#xff1a…...

pytorch_神经网络构建2(数学原理)

文章目录 深层神经网络多分类深层网络反向传播算法优化算法动量算法Adam 算法 深层神经网络 分类基础理论: 交叉熵是信息论中用来衡量两个分布相似性的一种量化方式 之前讲述二分类的loss函数时我们使用公式-(y*log(y_)(1-y)*log(1-y_)进行误差计算 y表示真实值,y_表示预测值 …...

Oracle SQL Developer 中查看表的数据和字段属性、录入数据

在Oracle SQL Developer中&#xff0c;选中一个表时&#xff0c;右侧会列出表的情况&#xff1b;第一个tab是字段的名称、数据类型等属性&#xff1b; 切换到第二个tab&#xff0c;显示表的数据&#xff1b; 这和sql server management studio不一样的&#xff1b; 看一下部门…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...