MySQL执行计划介绍

吃透MySQL(七):MySQL执行计划详细介绍 一,语法 在企业的应用场景中,为了知道优化SQL语句的执行,需要查看SQL语句的具体执行过程,以加快SQL语句的执行效率。 官网地址: https://dev.mysql.com/doc/refman/5.5/en/explain-output.html 1,explain 可以使用explain+SQL语句来模拟优化器执行SQL查询语句,从而知道mysql是如何处理sql语句的。 EXPLAIN 是解释 SQL 语句的执行计划,即显示该 SQL 语句怎么执行的。 EXPLAIN语法如下: {EXPLAIN 阅读详情

explain工具介绍

    使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈,因为SQL语句再执行过程中会在MySQL中进行一系列的分析,优化等等的操作。

     它返回的不是查询后的数据而是执行计划的信息,使用如下:

explain select * from actor;

返回的结果就是下图

1、id列

id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的 顺序增长的。并且id越大执行优先级就越高,id相同就从上往下执行,如果为null那么就是最后执行。

2、select_type

顾名思义,反应的是查询的类型是复杂查询还是简单查询,图上就是一个简单查询:simple;这个字段还有其它的值

1.primary:复杂查询中最外层的select语句

2.subquery:包含在 select 中的子查询(不在 from 子句中)

3.derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,也称为 派生表(MySQL新版本都是将衍生表有一个合并优化,所以一般不显示这个字段)

 set session optimizer_switch='derived_merge=off';#关闭衍生表的合并优化

下面用一个例子解释primary、subquery类型

explain select (select 1 from actor where id = 1) from (select * from film where id = 1) der

id越大越优先执行,也就是说subquery 优先执行,根据上面的介绍也就是在select语句中的子句,而且不在from中那么就是

(select 1 from actor where id = 1)#subquery

由于我自己的MySQL版本有点高,这个合并优化的语句不管用。。。。。。,大致是这么个意思。

4.union:在 union 中的第二个和随后的 select

explain select 1 union all select 1;

结果如下

也就是union all 后面的语句select 1

3、table列

也就是表示当前查询访问的是哪一张表。

4、 type列

这一列比较重要,反应的是当前查询语句的好坏,就是说MySQL决定如何查找表中的行,查找数据行记录的大概 范围

依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL,在优化SQL语句的时候保证到range级别。

NULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在 索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表。

const, system:mysql能对查询的某部分进行优化并将其转化成一个常量,用于 primary key 或 unique key 的所有列与常数比较时,所以表最多 有一个匹配行,读取1次,速度比较快。system是const的特例,表里只有一条元组匹配时为 system。

eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合 条件的记录。

ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀(最左前缀),索引要和某个值相比较,可能会找到多个符合条件的行。

range:范围扫描通常出现在 in(), between ,> ,= 等操作中。使用一个索引来检索给定 范围的行。

explain select * from actor where id > 1;

ALL:即全表扫描,意味着mysql需要从头到尾去查找所需要的行。一般这种情况是需要进行SQL优化了。

5、possible_keys列

该列反应的是当前查询语句可能用到的索引。explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况可能是因为表中的数据不多,MySQL在语句优化阶段判断可以不走索引,直接全表扫描

6. key列 这一列显示mysql实际采用哪个索引来优化对该表的访问。 如果没有使用索引,则该列是 NULL。

7、key_len列

这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。这个列也是常常用来推断select语句使用到了那些索引字段

比如一个table中的id是int类型,因为int是4字节。所以该字段就使用了id这个字段的索引。

key_len计算规则如下:

字符串 char(n):3n字节长度 varchar(n):2字节存储字符串长度,如果是utf-8,则长度 3n + 2

(如果字段允许为null,则key_len长度还需要+1)

数值类型 tinyint:1字节 smallint:2字节 int:4字节 bigint:8字节

时间类型 date:3字节 timestamp:4字节 datetime:8字节

如果字段允许为 NULL,需要1字节记录是否为 NULL 一般来说最好不要有为空的字段。

8. ref列

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常 量),字段名

9. rows列

这一列是mysql估计要读取并检测的行数,这里并不是最终的检索行数,而是一个估计数值

10. Extra列

这一列展示的是额外信息。常见的重要值如下:

Using index:使用覆盖索引

Using where:使用 where 语句来处理结果,查询的列未被索引覆盖

Using index condition:查询的列不完全被索引覆盖,where只是提供了一个范围

Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行 优化的,首先是想到用索引来优化

Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序,这种情况就是效率相当慢的

SQL语句的优化建议

1、查询时尽量使用全值匹配,使用索引作为条件时值要确定

2、最左前缀法则

单列索引要满足前面的字段如:select * from A where like ‘xx%’   这样like就不会全表扫描,如果是联合索引那么查询从索引的最左前列开始并且不跳过索引 中的列。意思就是如果有一张表A有一个联合索引(a,b,c)在使用联合索引查询时where中使用了a和c那么生效的只有a,c是不会生效的。

3、不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转 向全表扫描

4、尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),并确定查询的字段。

索引失效的情况还有:

.is null,is not null 也无法使用索引,所以建表的时候不要有可以为空的列

.mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描

.字符串不加单引号索引失效

少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索比例、 表大小等多个因素整体评估是否使用索引

Android GNSS 可视卫星星空图/卫星天顶图 原理及画法介绍 目录1 概念介绍2 绘制步骤2.1 获取卫星信息2.2 绘制底图 效果图: 1 概念介绍 首先介绍一下方位角和高度角的概念: 方位角:是从某点的指北(地理北极)方向线起,依顺时针方向到目标方向线之间的水平夹角。 高度角:从一点至观测目标的方向线与水平面间的夹角。 卫星天顶图 即是根据每一颗卫星的方位角和高度角将其画在以观测位置为中心的天顶图上。 天顶图其底图为由外向内的三个圆和四条直线。三个圆由外向内依次代表高度角0°、30°、60°,中心点代表90°;四条直线分别表示正北-正南、东北-西南、正东 阅读详情

相关推荐

逆向实战:喜马拉雅新版xm-sign算法解析与本地化生成方案

本文深入解析了喜马拉雅新版xm-sign算法的逆向过程与本地化生成方案。通过详细拆解browserid和sessionid的生成机制,提供了基于Node.js的核心代码实现,帮助开发者在不依赖官方环境的情况下生成有效签名。文章还涵盖了参数获取技巧、常见问题排查及性能优化建议,为爬虫开发者提供了实用的技术参考。

weixin_29256771的博客 299

MySQL执行计划详解

在进行SQL优化的时候我们常常使用explain来查看执行计划,这里来详细解释一下执行计划的字段意义 id 表示select语句的顺序,id值大的先执行,id相同则从上到下执行 select_type 这一列显示了 对应行是简单还是复杂SELECT, SIMPLE值意味着查询不包括子查询和UNION。查询有任何复杂的子部分,则最外层标记为PRIMARY table 输出数据行所在的表的名称,table列中经常出现类似或<union M,N>它表示该表为临时表。<>带有数字,它是se

零点悟的博客 350

Unity类银河恶魔城学习记录1-10 PlayerWallJump源代码 P37

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考

Homura_的博客 1379

Mysql的Explain关键字

explain关键字的理解。

aaaPostcard的博客 1339

MPC模型预测控制实战:从理论到代码实现(Python示例)

本文详细介绍了MPC模型预测控制的实战应用,从理论到Python代码实现。通过构建系统模型、预测方程、优化问题及约束处理,展示了如何实现一个完整的MPC控制器。文章还提供了水箱液位控制的应用案例,帮助读者掌握MPC在工业控制中的实际应用。

weixin_42653691的博客 461

【STM32】STM32F103C8T6多串口通信实战:3个USART并行收发与中断处理优化

本文详细介绍了STM32F103C8T6多串口通信的实战技巧,包括3个USART模块的并行配置、中断优先级优化及数据收发冲突规避策略。通过硬件初始化步骤、中断优先级设置和双缓冲区实现等方案,有效解决了多串口通信中的数据错乱问题,提升系统稳定性与效率。

weixin_42526417的博客 170

mysql 执行计划详解_MySQL 执行计划详解

我们经常使用 MySQL 的执行计划来查看 SQL 语句的执行效率,接下来分析执行计划的各个显示内容。执行计划的 idselect 查询的序列号,标识执行的顺序id 相同,执行顺序由上至下id 不同,如果是子查询,id 的序号会递增,id 值越大优先级越高,越先被执行先看id 相同,执行顺序由上至下(本质是先查找表数据量小的表)普通的关联查询,先查询执行数据量小的表(执行计划的ID相同):id 不...

weixin_28893597的博客 475

利用GBD数据库做未来疾病负担预测

最近看到一篇文献,利用GBD数据库中的数据对疾病负担的发展趋势进行预测。觉得很有趣,就抽空用R语言复盘了一下里面关键的方法。 参考文献: Changing trends in the disease burden of esophageal cancer in China from 1990 to 2017 and its predicted level in 25 years DOI: 10.1002/cam4.3775 1. 相关R包的安装 主要用到的R包有3个,一个一个讲: 1.1 Nordpred

NickyCat的博客 5万+

MySQL的执行计划详解(Explain)

MySQL的执行计划详解(Explain)

samker的博客 1万+

物联网技术-第2章-物联网技术架构

• 物联网具有很强的异构性• 为实现异构设备之间的互联、互通与互操作,物联网需要以一个开放的分层的可扩展的为框架。

m0_73804764的博客 2978

Linux安装部署PostgreSQL详细步骤

Linux安装部署PostgreSQL详细步骤

2301_77356579的博客 9324

Mysql执行计划-看这一篇就够了

Mysql执行计划

GM_115的博客 1万+

【零基础学习CAPL】——CAN报文的发送(CRC——ChecSum值)

本章主要介绍带有CRC值的报文发送一般报文可使用CANoe的IG模块直接发送,但带有CRC值的报文就只能编写脚本进行发送,以下详细讲解在配合Panel面板情况下,如何进行带有循环冗余码的报文进行报文的发送。

LOVE135149的博客 1915

Mysql执行计划含义,mysql执行计划介绍

烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长。如何写好sql,学会看执行计划至关重要。下面我简单讲讲mysql的执行计划,只列出了一些常见的情况,希望对大家有所帮助。测试表结构:CREATE TABLE `t1` (`c1` int(11) NOT NULL DEFAULT '0',`c2` varchar(128) DEFAULT NULL,`c3` ...

weixin_39948309的博客 153

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mysql 执行计划_mysql执行计划介绍

烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长。如何写好sql,学会看执行计划至关重要。下面我简单讲讲mysql的执行计划,只列出了一些常见的情况,希望对大家有所帮助。测试表结构:CREATE TABLE `t1` (`c1` int(11) NOT NULL DEFAULT '0',`c2` varchar(128) DEFAULT NULL,`c3` ...

weixin_33571513的博客 152

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL优化系列8-MySQL的执行计划介绍

备注:测试数据库版本为MySQL 8.0 文章目录一.使用EXPLAIN优化查询1.1 Explain语法及概述1.1.1 获取表结构信息1.1.2 获取执行计划信息1.1.3 使用EXPLAIN ANALYZE获取信息二.Explain输出格式2.1 EXPLAIN 输出列2.1.1 id (JSON name: select_id)2.1.2 select_type (JSON name: none)2.1.3 table (JSON name: table_name)2.1.4 partitions

只是甲的博客 3864

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

mysql的执行计划教程_通过实例介绍mysql执行计划工作原理及机制

mysql执行计划是sql语句经过查询优化器后,查询优化器会根据用户的sql语句所包含的字段和内容数量等统计信息,选择出一个执行效率最优(mysql系统认为最优)的执行计划,然后根据执行计划,调用存储引擎提供的接口,获取数据。但是,在mysql执行的时候,到底使用了一个什么样的执行计划,有没有用到索引。当数据规模比较大的时候,sql执行的时候,执行计划不同,会直接影响sql的执行速度。这个时候,就...

weixin_28766939的博客 280

mysql执行计划explain介绍_MySQL高级 之 explain执行计划详解

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。explain执行计划包含的信息其中最重要的字段为:id、type、key、rows、Extra各字段详解idselect查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序三种情况:1、id相同:执行顺序由上至下2、id不同:如果是子查...

weixin_42365539的博客 104

mysql执行计划介绍

mysql执行计划介绍 烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长。如何写好sql,学会看执行计划至关重要。下面我简单讲讲mysql的执行计划,只列出了一些常见的情况,希望对大家有所帮助。 测试表结构: 复制代码 代码如下: CREATE TABLE `t1` (   `c1` int(11) NOT NULL DEFAU

freson86的博客 203

mysql执行计划explain介绍_MYSQL 执行计划(explain详解)

使用explain后给出的相关索引信息下面是一个select语句的使用explain之后的例子:idselect查询的序列号select_typea.SIMPLE:查询中不包含子查询或者UNIONb.PRIMARY:查询中若包含任何复杂的子部分,最外层查询的标记c.SUBQUERY:在SELECT或WHERE列表中包含了子查询,该子查询的标记d.DERIVED(衍生):在FROM列表中包含的子查询...

weixin_42144086的博客 149

mysql执行计划字段解析_MySQL执行计划分析(EXPLAIN)之type字段详细介绍说明

接着上篇文章《mysql执行计划分析(explain)的简单介绍说明》 继续讲讲 MySQL 的执行计划(EXPLAIN)中的type 字段,由于type字段的详细说明篇幅较长,并且在分析SQL语句的执行性能上也是特别需要关注的重点,所以奶嘴单独开一片文章来详细讲解。type字段在 MySQL 官网文档描述如下:The join type. For descriptions of the dif...

weixin_42464317的博客 842

【转】mysql执行计划介绍

原文地址:http://www.jb51.net/article/43306.htm 1.查看mysql执行计划 explain SELECT * from shippingorder where STATUS<>4; 2.执行计划包含的信息 (1).id 含义,指示select字句或操作表的顺序。 eg1:id相同,执行顺序从上到下,下面的执行...

weixin_30685047的博客 72

Mysql -- 执行计划介绍

一、序言        作为程序员,难免要和数据库打交道,一般情况下,我们不是DBA ,但是又要写很多SQL,因此SQL效率就成了很大的问题。关于SQL效率优化,除了要掌握一定优化技巧外, 还得有很多经验的积累,但是这里我们可以通过执行计划对SQL进行分析,能快速找到优化的地方,这是一种很不错的方式,介绍给大家,大部分我是翻译而来,原文地址:http://dev.mysql.com/doc/r...

Hello World 270

mysql执行计划细节介绍

使用explain关键字可以模拟优化器执行sql查询语句,从而得知MySQL 是如何处理sql语句。 id select 查询的序列号,包含一组可以重复的数字,表示查询中执行sql语句的顺序。一般有三种情况: 第一种:id全部相同,sql的执行顺序是由上至下; 第二种:id全部不同,sql的执行顺序是根据id大的优先执行; 第三种:id既存在相同,又存在不同的。先根据id大的优先执行,再...

小萧山博客 163
上一篇: 概述MySQL事务隔离级别类型
下一篇: MySQL 数据库的 XA 规范
王大zhuang
博客等级 码龄11年 1粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值