前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MYSQL with Explain analyze 好马配好鞍?

MYSQL with Explain analyze 好马配好鞍?

作者头像
AustinDatabases
发布于 2020-05-12 15:55:21
发布于 2020-05-12 15:55:21
6000
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

随着曾经的一期MYSQL来自“旧金山的信息”中,MYSQL 8 大举更改数据库的优化器的事情已经是在目前版本上大举实现的事情了。而上期说的一些ORACLE 认为曾经在MYSQL上不应该实现的“好”功能,也都被取消了。同时祭出了新的MYSQL的查询分析, Explain analyze ,我们来看看 MYSQL 8 在这方面更改了多少。

首先我们看一个列子,在MYSQL5.7 上可以运行的一个查询

select distinct(es.emp_no),ss.salary,concat(es.last_name,' ',es.first_name)

from employees as es

left join salaries as ss on es.emp_no = ss.emp_no where ss.salary > 91530

group by emp_no

having max(ss.salary) ;

可以看到,这是可以查询出结果的。(但实际上这不符合 SQL 92的标准)

所以我们看看来自旧金山的 ORACLE OPEN 大会中提到的,那些不应该发生的“事情”,已经不能在MYSQL8.X上发生了,(默认SQL MODE 配置)

所以这也是上期提到了,MYSQL 的 DEVELOPER 需要接受的一些改变。

在传统的 EXPLAIN 中给出的执行计划有以下问题

1 给出的执行计划比较简单,对于复杂的查询分析出的计划阅读困难,关联性无法体现

2 给出的执行计划并非十分准确,而是评估的计划,如果要看实际的执行计划,必须进行真实的运算后,才能得到真实的执行计划

select concat(es.first_name,' ',es.last_name),ts.title

from employees as es

left join titles as ts on es.emp_no = ts.emp_no

where ts.title = 'manager' and to_date = '9999-01-01';

我们以上面的语句作为例子

| -> Nested loop inner join (cost=46084.11 rows=4422) (actual time=108.896..309.845 rows=9 loops=1)

-> Filter: ((ts.to_date = DATE'9999-01-01') and (ts.title = 'manager') and (ts.emp_no is not null)) (cost=44536.30 rows=4422) (actual time=108.366..309.135 rows=9 loops=1)

-> Table scan on ts (cost=44536.30 rows=442233) (actual time=0.516..204.424 rows=443308 loops=1)

-> Single-row index lookup on es using PRIMARY (emp_no=ts.emp_no) (cost=0.25 rows=1) (actual time=0.070..0.071 rows=1 loops=9)

从上面给出的计划来看,1 先对 TS 进行 TABLE SCAN 行数 442233 行,实际上是 443308 行, 通过 INDEX LOOKUP 的方式,每次扫描使用0.07毫秒,并且同时会过滤 to_date, title emp_no 等条件 采用 Nested loop inner join 的方式。

实际上透露了大约执行的时间和执行的次序,每行的操作的COST 等等时间,这点和ORACLE 是越来越像。并且还告诉你,实际的执行计划走的 INNER JOIN

我们在看一个列子

完全是ORALCE的风格。

当然也可以写成另外一种格式,输出是一样的

explain format=tree select concat(es.first_name,' ',es.last_name),ts.title from employees as es left join titles as ts on es.emp_no = ts.emp_no where ts.title = 'manager' and to_date = '9999-01-01';

另外可能有细心的同学会看到,actual time= xxx .. xxxxx 这里的意思是单行成本时间 和 总体成本时间,所以EXPLAIN ANALYZE 的输出已经完全和ORACLE 接轨,或者说和所有的数据库接轨( 因为 ORACLE , PG , SQL SERVER )都可以这样显示执行计划,SQL SERVER 甚至可以动态图的方式给你显示。

那么从MYSQL 8 开始一套整体的查看执行计划,或评估计划的方式已经是成为体系

1 评估执行计划可以使用 explain format=tree

2 实际的执行计划直接 explain analyze

3 明白执行计划选择的方式与路径 optimizer trace

所以MYSQL 8 的确是一份认真的作业。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 8 查询优化新工具 Explain Analyze
Explain 是我们常用的查询分析工具,可以对查询语句的执行方式进行评估,给出很多有用的线索。
dys
2020/07/07
1.6K0
MySQL——SQL练习题
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100174.html原文链接:
全栈程序员站长
2021/05/21
9230
MySQL——SQL练习题
新特性解读 | MySQL 8.0:explain analyze 分析 SQL 执行过程
爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。
爱可生开源社区
2022/02/09
4.6K0
新特性解读 | MySQL 8.0:explain analyze 分析 SQL 执行过程
MySQL 调优 | OPTIMIZER_TRACE 详解
OPTIMIZER_TRACE是MySQL 5.6引入的一项跟踪功能,它可以跟踪优化器做出的各种决策(比如访问表的方法、各种开销计算、各种转换等),并将跟踪结果记录到 INFORMATION_SCHEMA.OPTIMIZER_TRACE 表中。此功能默认关闭,开启后,可分析如下语句:
用户1516716
2020/07/28
4.5K0
MySQL8.0 优化器介绍(一)
线上,遇到一些sql性能问题,需要手术刀级别的调优。optimizer_trace是一个极好的工具,已经有很多资料介绍optimizer_trace怎么使用与阅读。有必要再介绍一下我们平时不太能注意到,但是又对sql性能起着绝对作用的优化器。
GreatSQL社区
2023/08/10
4110
MySQL8.0 优化器介绍(一)
MySQL的EXPLAIN
MySQL的EXPALIN是优化查询语句必不可少的工具,用户通过它可以获得查询计划的相关信息,查看优化器的选择。
MySQLSE
2023/12/19
2140
MySQL的EXPLAIN
MySQL SQL 优化命令行&问题 SQL 抓取方式
对于数据库来说安装,部署几乎是一次性的。后期的管理和优化是持续性的工作。 对于MySQL来说,可以说90%问题都在SQL语句上面。从问题SQL的筛选和优化,在MySQL环境下常用哪些方式。(以下版本是MySQL8.0.23) MySQL优化前置知识基础
数据和云
2021/03/09
9000
MySQL SQL 优化命令行&问题 SQL 抓取方式
SQL优化极简法则,还有谁不会?
SQL 本身并不难学,编写查询语句也很容易,但是想要编写出能够高效运行的查询语句却有一定的难度。
爱撒谎的男孩
2021/01/06
1.1K0
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
当时指出了一些问题,基于时间的原因知道有问题,但没有说出具体的问题,当时也提到这样写语句,数据库基本上无法走执行计划,因为没有统计分析。
AustinDatabases
2024/01/26
1760
PostgreSQL  查询语句开发写不好是必然,不是PG的锅
EXPLAIN FORMAT=json和EXPLAIN ANALYZE查询计划解读
通常EXPLAIN用于获取QEP,而DESCRIBE、DESC用于获取表结构信息。
chenchenchen
2020/07/03
3.2K0
【牛客SQL】03查找当前薪水详情以及部门编号dept_no
查找各个部门当前(to_date=‘9999-01-01’)领导当前薪水详情以及其对应部门编号dept_no CREATE TABLE dept_manager ( dept_no char(4) NOT NULL, emp_no int(11) NOT NULL, from_date date NOT NULL, to_date date NOT NULL, PRIMARY KEY (emp_no,dept_no)); CREATE TABLE salaries ( emp_no int(11) NOT NULL, salary int(11) NOT NULL, from_date date NOT NULL, to_date date NOT NULL, PRIMARY KEY (emp_no,from_date));
韩旭051
2020/06/23
3960
牛客网数据库实战题解题思路及答案
SQL4请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示,字段:last_name,first_name,dept_no
关忆北.
2021/12/07
6150
牛客网数据库实战题解题思路及答案
通过一条简单的SQL 来理解MYSQL的解析SQL的过程
(因为打赏账号,所以作者署名必须是 carol11, 实际作者还是 Austin Liu)
AustinDatabases
2019/06/21
8180
通过一条简单的SQL 来理解MYSQL的解析SQL的过程
常见Oracle HINT的用法
Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。
jack.yang
2025/04/05
1050
升级MySQL5.7,开发不得不注意的坑
前段时间,将线上MySQL数据库升级到了5.7。考虑到可能产生的不兼容性,在升级之前,确实也是战战兢兢,虽然测试环境,开发环境早在半年前就已提前升级。
星哥玩云
2022/08/16
6650
MySQL 8.0 新特性:引人注目的哈希连接(Hash Join)
blog.csdn.net/horses/article/details/102690076
肉眼品世界
2020/11/11
7600
MySQL 8.0 新特性:引人注目的哈希连接(Hash Join)
MySQL练习三:查找当前有薪水记录的员工以及部门信息
请你查找各个部门当前领导的薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列,以上例子输出如下:
兔云小新LM
2021/09/20
7850
MySQL练习三:查找当前有薪水记录的员工以及部门信息
剑指offer数据库语句
这里注意max min等函数属于对结果进行的统计,因此我们不能将其直接作为条件(如hire_date=MAX(hire_date)),可以另起语句
名字是乱打的
2022/05/13
2510
剑指offer数据库语句
第 51 期:根据 EXPLAIN EXTRA 栏提示进行优化(三)
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。----
爱可生开源社区
2025/02/25
860
第 51 期:根据 EXPLAIN EXTRA 栏提示进行优化(三)
MySQL8.0发布,你熟悉又陌生的Hash Join?
昨天下午在查资料的时候,无意间点到了MySQL的doc。发现MySQL发布了一个新版本。
王知无-import_bigdata
2020/02/10
8190
相关推荐
MySQL 8 查询优化新工具 Explain Analyze
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档