【数据库】EXPLAIN

MyBatis EXPLAIN分析:优化数据库查询 在当今的软件开发领域,数据库操作是构建应用程序不可或缺的一部分。随着业务需求的日益复杂,如何高效地执行数据库查询,优化查询性能,成为了开发人员关注的焦点。MyBatis作为一款优秀的持久层框架,以其简洁的配置和强大的动态SQL功能,在业界得到了广泛的应用。本文将围绕MyBatis的核心知识点——EXPLAIN分析,对MyBatis进行简要的介绍,并概述其作用和优势。在实际开发中,我们常常会遇到这样的问题:在执行数据库查询时,如何理解查询的执行计划,如何优化查询性能? 阅读详情

https://www.cnblogs.com/gomysql/p/3720123.html

 

Explain 查看优化器如何执行查询的主要方法, 可以了解MySQL基于开销的优化器

 

查询结果包含的列有:

 

id | select_type  | table      | type   | possible_keys | key  | key_len | ref  | rows | Extra  

1. id: 表示查询表中执行select语句的操作表顺序

ID相同,执行顺序从上至下。 

如果是子查询,ID序号会增加,ID 越大优先级越高,越先被执行

2. select_type 表示每个select子句的类型(简单or复杂)

 

a. SIMPLE 查询中不包含子查询或者 UNION

b. 查询中包含任意复杂的子部分, 最外层查询被标记为: PRIMARY

c. 在SELECT或者 WHERE 列表中包含了子查询,该子查询被标记为: SUBQUERY

d. 在FROM列表中包含在子查询被标记为,DERIVED(衍生) 用来表示包含在 from 字句中的select, MySQL会将递归执行的结果放到一个临时表(服务器内部称为派生表, 因为该表是从子查询中派生出来的)中

e. 若第二个Select 出现在UNION之后,被标记位UNION,若UNINO出现在FROM语句中,外层SELECT被标记位 DERIVED

f. 从UNION表中获取结果的SELECT被标记为UNION RESULT

 

(root@yayun-mysql-server) [test]>explain select d1.name, ( select id from t3) d2 from (select id,name from t1 where name='')d1 union (select name,id from t2);
+----+--------------+------------+--------+---------------+------+---------+------+------+--------------------------+
| id | select_type  | table      | type   | possible_keys | key  | key_len | ref  | rows | Extra                    |
+----+--------------+------------+--------+---------------+------+---------+------+------+--------------------------+
|  1 | PRIMARY      | <derived3> | system | NULL          | NULL | NULL    | NULL |    0 | const row not found      |
|  3 | DERIVED      | t1         | ref    | name          | name | 63      |      |    1 | Using where; Using index |
|  2 | SUBQUERY     | t3         | index  | NULL          | age  | 5       | NULL |    6 | Using index              |
|  4 | UNION        | t2         | index  | NULL          | name | 63      | NULL |    4 | Using index              |
| NULL | UNION RESULT | <union1,4> | ALL    | NULL          | NULL | NULL    | NULL | NULL |                          |
+----+--------------+------------+--------+---------------+------+---------+------+------+--------------------------+
rows in set (0.00 sec)
 
 
# 第一行:id列为1,表示第一个select,select_type列的primary表 示该查询为外层查询,table列被标记为<derived3>,表示查询结果来自一个衍生表,其中3代表该查询衍生自第三个select查询,即id为3的select。
# 第二行:id为3,表示该查询的执行次序为2( 4 => 3),是整个查询中第三个select的一部分。因查询包含在from中,所以为derived。
# 第三行:select列表中的子查询,select_type为subquery,为整个查询中的第二个select。
# 第四行:select_type为union,说明第四个select是union里的第二个select,最先执行。
# 第五行:代表从union的临时表中读取行的阶段,table列的<union1,4>表示用第一个和第四个select的结果进行union操作。

SUBQUERY 和 UNION 还会被标记为 DEPENDENT 和 UNCHANGABLE

DEPENDENT 意味着 select 依赖于外层查询中发现的数据

UNCHANGABLE 意味着 select 中的某些特性阻止被缓存在一个 item_cache 中

 

3. type 表示 MySQL在表中查询时候所需要的方式, 又称为“访问类型”

类型包括

ALL, index, range, ref, eq_ref, const, system, NULL

从左到右 性能从低到高

a. ALL: Full Table Scan MySQL 遍历全表找到匹配的行

 

explain select * from t_device;

 

b. index : Full index Scan 遍历索引树

 

explain SELECT id from t_device;

c. range: 索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行(一般是索引范围性扫描,带有 between 或者 where 字句中带有 < > 的 或者  in or

 

d. ref: 使用非唯一索引扫描,返回匹配某个单独值的记录行

 

explain select * from t1 where name='yayun'

 

e. eq_ref: 类似于 ref 区别是使用的索引是唯一索引, 对于每个索引值,表中只有一条记录。(多表连接中的pk 或者 unique key 作为关联条件)

 

explain select t1.name from t1, t2 where t1.id=t2.id;

f. const、System: 当MySQL对查询某部分优化时,并转化为一个常量,使用这些类型访问。 如果将主键置于where中,MySQL就能转化为常量

 

explain select * from ( select * from t1 where id=1)b1;

g. NULL: MySQL在优化过程中分解语句,执行中不用访问索引或者表,例如计算主键最小值,可以通过单独索引计算完成

 

explain select * from t1 where id = (select min(id) from t2);

 

4. possible_keys

指的是,MySQL使用哪个索引可以在表中查找到记录,查询涉及到的字段存在索引,则列出(可能不使用)

 

5. key

显示MySQL在查询中使用的索引,如果没有索引,则显示NULL

 

6. key_len

索引中使用到的字节数,可以通过列计算查询中使用的索引长度(key_len 显示的值为索引字段的最大长度,并非实际使用长度, 也就是根据表的定义计算而得)

 

7. ref

表示上述表的连接配置条件,即哪些列或常量用于查找索引列上的值

 

8. rows

表示 MySQL 根据表统计及索引选用情况,估算的找到所需要记录所需要读取的行数

 

9. Extra

a. Using index 该值表示相对应的select操作中使用了覆盖索引

    覆盖索引: 如果一个索引包含或覆盖了查询所需要的查询字段的值, 只需要扫描索引, 不需要回表

 

b. Using where 

    表示MySQL 服务器在存储索引之后再进行过滤。 许多where条件设计索引的列(不是所有的where 都会有 using where),需要回表查询

 

c. Using temporary

    表示 MySQL 需要临时表来存储结果数据,常见排序和分组

 

d. Using filesort

    mysql 无法使用索引完成的排序操作,

 

e. Using join buffer

    强调在获取连接时候没有使用索引

 

f. Impossible where

    强调了where会导致没有符合条件的行

 

g. Select tables optimized away

    意味着通过索引,优化器从聚合函数中返回一行

 

h. Index merges

    当 MySQL在给定的表上使用超过两个索引时候,

 

    Using sort_union(...)

    Using union(...)

    Using intersect(...)

 

 

 

总结:

• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况

• EXPLAIN不考虑各种Cache

• EXPLAIN不能显示MySQL在执行查询时所作的优化工作

• 部分统计信息是估算的,并非精确值

• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

 

 

华为GaussDB数据库:EXPLAIN执行计划深度解析 GaussDB执行计划分析与优化摘要(150字) GaussDB执行计划是数据库优化器生成的查询操作步骤,通过EXPLAIN命令可分析执行路径、访问方法和资源消耗。执行计划在性能诊断、优化验证和调优指导中起关键作用。GaussDB的特色包括分布式执行、向量化引擎和智能优化器。EXPLAIN提供多种语法选项(ANALYZE、VERBOSE等),输出包含成本预估与实际执行数据。常见操作符包括顺序扫描(适合全表查询)、索引扫描(高效点查询)和位图扫描(多条件组合查询)。优化建议包括合理添加索引、验证行数预估准确性 阅读详情

相关推荐

【数据库系列】 如何使用 EXPLAIN 分析结果优化 SQL 查询

`EXPLAIN` 是 MySQL 中的一个重要工具,可帮助我们理解查询的执行计划。通过分析 `EXPLAIN` 的输出,我们可以识别潜在的性能瓶颈并优化 SQL 查询。以下将详细介绍如何利用 `EXPLAIN` 的分析结果进行 SQL 优化,结合示例来说明。

颜淡慕潇 1万+

MYSQL explain详解

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 虽然这篇文章我写的很长,但看起来真的不会困啊,真的都是干货啊!!!! 先解析一条sql语句,看出现什么内容 EXPLAINSELECTs.uid,s.username,s.name,f.email,f.mobile,f.phone,f.postalcode,f.address FROMuchome_spaceASs,uchome_spacefieldASf WHER...

Coder 9万+

SpringBoot与锐浪报表服务器深度整合实战指南

本文详细介绍了SpringBoot与锐浪报表服务器的深度整合实战指南,包括环境准备、Windows/Linux系统配置、核心功能实现代码解析及常见问题解决方案。通过具体案例和代码示例,帮助开发者高效完成报表系统的集成与部署,提升企业级应用的报表处理能力。

weixin_29238147的博客 369

MYSQL _数据库_EXPLAIN(查询性能优化)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、EXPLAIN是什么?二、有什么用?三、Explain 的每个字段3.1、id(必记住)3.2、select_type3.3、table3.4、type(必记住)3.5、possible_keys3.6、key3.7、key_len3.8、ref3.9、rows(记)3.10、extra(记)四、MySQL执行计划(explain)的局限性参考文章 前言 提示:这里可以添加本文要记录的大概内容: EXPAIN 记录。 .

一个后端菜鸟的博客 9835

# ubuntu 系统使用 yum命令报错 There are no enabled repos.Run “yum repolist all“ to see the repos you have...

# ubuntu 系统使用 yum命令报错 There are no enabled repos.Run "yum repolist all" to see the repos you have.You can enable repos with yum-config-manager --enable

段子手168的博客 6682

[DA45] 使用PageRank算法分析希拉里邮件中的人物关系

一. 相关知识 (一) PageRank算法 PageRank 算法是 google 公司的创始人拉里·佩奇和谢尔·盖布林于1998年提出的网页搜索优化算法. 详细内容请见百度百科:google pagerank. 如果你了解了该算法, 就能明白上一段的超链接从本页面链出, 链入百度百科的 PageRank 算法页面增加了该页面...

Vincent_Chu的博客 2376

数据库系列5:explain命令

1.索引的使用原则 索引是不是创建越多越好,或者给越多的字段加索引越好呢?根据上一章介绍的索引特征,我们会发现不一定。优化器本身能进行一定的优化, 原则就是基于开销cost,而不是基于规则和语义的,怎么开销小就怎么来。但是我们平时用的时候也要注意一些规则,网上总结了一下,常用规则有如下一些,那我们如何检验我们索引的效果呢?这就是本文的核心内容。 首先看常用的规则 1.用于where判断和order排序和jion的,on的,group by 的字段上创建索引 2.索引的个数不要过多,否则浪费空间,更新变慢。

纵横千里 捭阖四方 的专栏 2687

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式)

最后我觉得这个项目最重要的部分还是陀螺仪的精准度,如果一个陀螺仪的精准度高,这个项目就十分简单了,像mpu6050这种陀螺仪精准度就稍微差了一点,他有个最严重的问题就是温漂,偏航角会随着温度变化为变化,这一点在跑发挥项一的时候十分关键的,因为这个只差基督就会导致车子跑偏,导致无法完成 整个项目。如果条件足够的话建议可以换一个好一点的陀螺仪,然后就是灰度如果没有条件同样也可以换成红外。以上就是本次项目的一些小建议。

weixin_60991529的博客 6242

mysql explain select,MySQL数据库下的Explain命令深度解析

原标题:MySQL数据库下的Explain命令深度解析Explain是一个非常有的命令,可以用来获取关于查询执行计划的信息,以及如何解释输出。Explain命令是查看查询优化器如何决定执行查询的主要方法。这个功能有一定的局限性,并不总是会说出真相,但是它的输出是可以获取的最好信息,值得花时间了解,可以学习到查询是如何执行的。调用Explain要使用Explain,只需在查询中的select关键字之...

weixin_42503069的博客 499

大开眼界的十大开源人工智能项目

这是一个强大的开源工具,能让你在不同框架之间自由切换,无需重写代码。它是一个开源工具,能用简单的SQL语言同时处理数据和AI模型,让一切变得有序而高效。Rasa是我开发智能聊天机器人时的首选,它让你轻松掌控机器人对话的每个细节。我经常用它快速验证模型在不同框架下的表现,省去了大量烦躁的调试过程。最近发现的Vapi是一个以API方式提供的语音AI工具,开发者友好程度超乎想象。KNIME是一个以拖拽方式构建数据分析流程的开源工具,仿佛是数据界的乐高积木。它像个忠诚的守门员,确保你的模型始终健康运行。

wjianwei666的专栏 1105

基于深度确定性策略梯度的永磁同步电机强化学习控制方法

本文提出了一种基于深度确定性策略梯度(DDPG)的永磁同步电机(PMSM)电流内环智能控制方法。首先建立了PMSM在d-q坐标系下的数学模型,分析了传统矢量控制双闭环系统中PI控制器的局限性。针对电流内环控制问题,设计了包含电流跟踪误差、转速信息和历史控制量的状态空间,将电压输出作为动作空间,并构建了兼顾跟踪精度和响应速度的奖励函数。通过DDPG算法训练智能体,使其能够自适应调整控制策略。仿真结果表明,与固定参数的PI控制器相比,DDPG控制器在动态响应速度和抗干扰能力方面具有明显优势,为PMSM高性能控制

huanghm88的专栏 104

Explain详解

目录 一、表信息 二、explain 的两种使用方式 三、explain中的列 1. id列 2. select_type列 3. table列 4. type列 5. possible_keys列 6. key列 7. key_len列 8. ref列 9. rows列 10. Extra列 四、索引最佳实践 使用EXPLAIN关键字可以模拟优化器执行SQL语句...

AN_ERA的博客 1万+

Transformer模型详解

​本文主要介绍Transformer系列,从基础到理论,对注意力机制进行总结并解释《Attention is all you need》,提出解决sequence to sequence问题的transformer模型,用全attention的结构代替了lstm,抛弃了之前传统的encoder-decoder模型必须结合cnn或者rnn的固有模式,只用attention。文章的主要目的是在减少计算量和提高并行效率的同时不损害最终的实验结果。

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 5291

HighGo Database中auto_explain模块的使用介绍

当我们想要跟踪大型应用中未优化的查询时,可使用auto_explain模块提供的一种自动的记录慢速语句执行计划的方法。这种方法可以让我们不必手动的运行EXPLAIN语句,所以使用这种方式是很有帮助的。1、使用方法要想使用这个模块,只需要把它加载到服务器中(只有数据库超级用户可以运行这条指令):highgo=# LOAD ‘auto_explain’; LOAD然后无论何时发生了意料之外的慢查询,我们都可以进行追踪。2、配置参数介绍及示例配置参数控制着auto_explain的行为。需要注意的是,默认情况下的

HighGO 681

基于Simulink进行多相电机EMI抑制的仿真建模

特点高可靠性:通过增加相数来提供冗余,增强系统的故障容忍度。低转矩脉动:改善了电机的动态性能,减少了转矩波动。复杂的EMI管理:更多的相数意味着更复杂的电磁环境,增加了EMI抑制的难度。挑战模型复杂性:涉及电气、机械和电磁场等多个领域的相互作用。实时性要求:控制系统需要能够快速响应以适应动态负载变化。多变量优化:包括滤波器设计、PWM调制策略等在内的多个参数需综合考虑以找到最优解。使用Simscape Electrical库来构建一个多相电机模型。

amy_mhd的博客 272

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

达梦数据库——explain

达梦数据库性能优化

liyuan_yoao的博客 1563

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MongoDB执行计划获取(db.collection.explain())

在RDBMS中,无论那种数据库,都提供了SQL剖析工具,用来解决SQL效率低下的问题。在MongoDB中,也有相应的策略来实现剖析。MongoDB提供了db.collection.explain()方法, cursor.explain()方法, 和explain命令去返回查询计划信息和查询计划的执行统计信息。这为我们诊断查询提供了极大的便利,本文主要描述db.collection.explain()

乐沙弥的世界 2万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Mysql+Explain数据库优化分析

Explain数据库优化分析 Explain各字段解释 分析语句: #至少有2位非掌门人成员的门派 explain select t_dept.* from t_dept, (select deptId id, count(*) count from t_dept d, t_emp e where e.deptId = d.id ...

张文军 254

PG数据库中的EXPLAIN用法

PG数据库中的EXPLAIN用法 一、EXPLAIN语法 EXPLAIN命令的主要作用是输出一个query的整个查询计划,具体语法如下: EXPLAIN [ ( option [, ...] ) ] statement EXPLAIN [ ANALYZE ] [ VERBOSE ] statement where option can be one of: ANALYZE [ boolean ] VERBOSE [ boolean ] COSTS [ boolean ]

xitianxiaofeixue的博客 7046

数据库—如何使用explain分析SQL执行计划

EXPLAIN通过EXPLAIN分析 SQL 执行计划,可以快速定位性能瓶颈。重点关注typerows和Extra列,优先优化全表扫描、临时表和文件排序等问题。不同数据库的EXPLAIN输出略有差异,但核心思路一致。

z17826856787的博客 3977

MySQL数据库下的Explain命令深度解析

我们学习必然是为了找到高薪的工作,下面这些。

2301_78276982的博客 1120
上一篇: 【数据库】性能优化
下一篇: 【数据库】索引
三生石1103
博客等级 码龄12年 16粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值