iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL执行计划EXPLAIN详解
  • 101
分享到

MySQL执行计划EXPLAIN详解

2024-04-02 19:04:59 101人浏览 泡泡鱼
摘要

本文以Mysql 5.7 Reference Manual为主轴(翻译&取其精华)并结合网文百家之长整理而成,因为笔者水平有限,文中如有不准确之处请包涵,如转载请注明原文出处guocun


本文以Mysql 5.7 Reference Manual为主轴(翻译&取其精华)并结合网文百家之长整理而成,因为笔者水平有限,文中如有不准确之处请包涵,如转载请注明原文出处guocun09-Oraman的日记

 

基本概念:

EXPLaiN 提供sql语句是怎么样执行的信息,为select,delete,insert,replace,update语句工作。

EXPLAIN为查询语句中使用到的每个table返回一行信息。

mysql中所有的join方式都是使用nested-loop join

 

一.详细说明

EXPLAIN Output Columns

列名

解释

说明

id

select标识符

Query Optimizer选定执行计划中查询的序列号。表示查询中执行select子句或操作表的顺序,id值越大优先级越高,越先被执行。id 相同,执行顺序由上至下

select_type

select类型

没有子查询或uNIOn时都是simple,否则会有primary和union之类的,这里要注意带有uncacheable的类型,表示无法缓存,外层行切换会导致重新计算该select

table

输出行所属的表

表名或<unionM,N>,<derivedN>,<subqueryN>

partitions

匹配的分区

涉及到表的分区,没有使用分区则是NULL

type

join类型

下面有详细说明

possible_keys

可能被选择的索引

MySQL能在该表中使用哪些index助于查询,如果为空,说明没有可用index

key

实际被选择的索引

实际决定选择的index,如果没有选择index,值为NULL

key_len

被选择的键的长度

MySQL在多部分索引中使用的部分的长度,可能有多个值

ref

需要与索引比较(连接)的列

列名或者const(常数,where id = 1的时候就是const了)

rows

估计要被检验的行数

InnoDB中不一定精确,只是一个估计值

filtered

被表的条件所过滤的行的百分比

估计值

extra

额外信息

附加信息


1.select_type

select_type类型

说明

SIMPLE

简单的select查询,不使用 union 及子查询

PRIMARY

最外层的select查询

UNION

UNION 中的第二个或随后的select查询,不依赖于外部查询的结果集

DEPENDENT UNION

UNION 中的第二个或随后的select查询,依赖于外部查询的结果集

SUBQUERY

子查询中的第一个select查询,不依赖于外部查询的结果集

DEPENDENT SUBQUERY

子查询中的第一个select查询,依赖于外部查询的结果集

DERIVED

用于from子句里有子查询的情况。 MySQL会递归执行这些子查询,把结果放在临时表里

UNCACHEABLE SUBQUERY

结果集不能被缓存的子查询,必须重新为外层查询的每一行进行评估

UNCACHEABLE UNION

UNION 中的第二个或随后的select查询,属于不可缓存的子查询


2.Join类型(type栏位)

Join类型

(按最优到最差排序)

说明

system

表只有一行(=system表)

const

表最多只有一行匹配,通常用到:PK或Unique index

eq_ref

每次与之前的表合并行都只在该表读取一行,这是除了system,const之外最好的一种,

特点是使用=,而且索引的所有部分都参与join且索引是主键或非空唯一键的索引

ref

使用=或<=>,可以是最左前缀索引或非主键或非唯一键,如果每次只匹配少数行,那会是比较好的

fulltext

全文索引搜索

ref_or_null

与ref类似,但包括NULL

例:SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;

index_merge

索引合并,比如一个table中有多个index column在where条件中

例:SELECT * FROM ref_table WHERE key_column1=expr1and key_column2=expr2;

unique_subquery

仅仅只是索引查找,取代子查询完全获得更好的效率

例:value IN (SELECT primary_key FROM single_table WHERE some_expr)

index_subquery

同上,但替换子查询中的”select non_unique_key_column“

range

index范围检索,key 栏位显示使用了哪个索引

通常用到:=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, or IN()

index

index全扫描,两种情形:

1.仅仅扫描整个index tree,这时Extra栏位为Using index

2.按照index 顺序全表扫描,这时Extra栏位不会出现Using index

all

全表扫描


3.Extra信息(常用附加信息)

Extra信息

说明

const row not found

Table was empty

distinct

查询唯一值,发现到一个匹配的就停止当前搜索

FirstMatch(tbl_name)

The semi-join FirstMatch join shortcutting strategy is used for tbl_name.

No tables used

查询没有from子句,或有from dual 子句

No exists

优化了left join,一旦找到了配置left join的行就不再检索,例如:

SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id  WHERE t2.id IS NULL;

Range checked for each record (index map: N)

没找到理想的index,从前面一个表中找一个行的组合,mysql检查那个index 能否range或者index merge方式从表中返回数据。它不是很快,但比没有index要好

Using fliesort

使用排序检索,出现时性能可能不高

Using index

Index scan,不需要回表

Using index condition

Using join buffer

Block Nested Loop,

Tables from earlier joins are read in portions into the join buffer, and then their rows are used from the buffer to perfORM the join with the current table.

Using temporary

Query过程中构造一张临时表,常见order by,group by中。出现时性能可能不高

Using where

有where子句


. 实验

环境准备

CREATE DATABASE `GC` ;

use gc;

CREATE TABLE `emp` (

  `emp_no` varchar(20) NOT NULL,

  `emp_name` varchar(30) NOT NULL,

  `age` int(11) DEFAULT NULL,

  `dept` varchar(45) DEFAULT NULL,

  PRIMARY KEY (`emp_no`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into emp values ('MW00001','Oraman',30,'1');

insert into emp values ('MW00002','GC',25,'2');

insert into emp values ('MW00003','Tom Kyte',50,'1');

insert into emp values ('MW00004','Jack Ma',40,'3');

insert into emp values ('MW00005','James',33,'4');

CREATE TABLE `dept` (

  `dept_no` varchar(45) NOT NULL,

  `dept_name` varchar(30) NOT NULL,

  `dept_header` varchar(20) DEFAULT NULL,

  PRIMARY KEY (`dept_no`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into dept values ('1','DBA','MW00003');

insert into dept values ('2','DEV','MW00002');

insert into dept values ('3','BOD','MW00004');

insert into dept values ('4','Business','MW00005');

您可能感兴趣的文档:

--结束END--

本文标题: MySQL执行计划EXPLAIN详解

本文链接: https://www.lsjlt.com/news/47327.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql explain执行计划详解
    ...
    99+
    2024-04-02
  • MySQL的执行计划详解(Explain)
    1、MySQL执行计划的定义 在 MySQL 中可以通过 explain 关键字模拟优化器执行 SQL语句,从而知道 MySQL 是如何处理 SQL 语句的。 2、MySQL整个查询的过程 • 客户端向 MySQL 服务器发送一条查询请求 ...
    99+
    2023-08-19
    mysql 数据库 java
  • mysql如何执行计划explain
    这篇文章给大家分享的是有关mysql如何执行计划explain的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、说明用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引...
    99+
    2023-06-15
  • MySQL中执行计划explain命令示例详解
    前言 explain命令是查看查询优化器如何决定执行查询的主要方法。 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的。 调用EXPLA...
    99+
    2024-04-02
  • MySQL执行计划explain的key_len解析
    作者 :沃趣科技高级数据库专家 邱文辉  ...
    99+
    2024-04-02
  • mysql之 explain、optimizer_trace 执行计划
    一、explain  mysql> explain select host,user,plugin from user ; +----+-------------+-------+...
    99+
    2024-04-02
  • MySQL中Explain执行计划的案例
    这篇文章给大家分享的是有关MySQL中Explain执行计划的案例的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1. Explain 简述Explain 语句可以查看 MySQL...
    99+
    2024-04-02
  • 一文带你了解MySQL之Explain执行计划
    前言: 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。MySQL为我们提供了E...
    99+
    2023-08-18
    mysql 数据库 大数据 数据库架构 数据库开发
  • MySQL 中,EXPLAIN执行计划的type含义
    执行计划中的 type 字段表示 MySQL 在执行查询时使用的访问类型,也就是 MySQL 在访问表时使用的算法。 以下是 MySQL 中常见的 type 类型及其含义: system:这是最高级别的访问类型,表示 MySQL 只有一行...
    99+
    2023-10-23
    mysql
  • MySQL执行计划explain输出列结果解析
    1) id:每个被独立执行的操作的标识,表示对象被操作的顺序;id值大,先被执行;如果相同,执行顺序从上到下。 2) select_type:查询中每个select子句的类型; 3) table:名字,被操...
    99+
    2024-04-02
  • MySQL中通过EXPLAIN如何分析SQL的执行计划详解
    前言 在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。 下面分别对EXPLAIN命令结果的每一列...
    99+
    2024-04-02
  • explain中怎么查看执行计划
    explain中怎么查看执行计划,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。explain内容查看user全表查询的执行计划:mysql...
    99+
    2024-04-02
  • 一文带你了解SQL的执行计划(explain)
    一. 什么是SQL执行计划 为什么关注sql的执行计划,因为一个sql的执行计划可以告诉我们很多关于如何优化sql的信息 。 通过一个sql计划,如何访问中的数据 (是使用全表扫描还是索引查找?...
    99+
    2023-08-31
    数据库 mysql explain 执行计划分析
  • postgres explain如何查看sql执行计划
    这篇文章主要为大家展示了“postgres explain如何查看sql执行计划”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“postgres explain如...
    99+
    2024-04-02
  • MySql中怎么使用explain查询SQL的执行计划
    这篇文章主要介绍MySql中怎么使用explain查询SQL的执行计划,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!explain命令是查看查询优化器如何决定执行查询的主要方法。这个...
    99+
    2024-04-02
  • MySQL执行计划解析(四)
    本文是对于MySQL执行计划的解析,主要解释了MySQL执行计划中的各个参数及含义。  十三、Extra 产生的值 存在六种情况: Using filesort、Using tempor...
    99+
    2024-04-02
  • mysql通过explain获取查询执行计划的信息
    这篇文章主要介绍“mysql通过explain获取查询执行计划的信息”,在日常操作中,相信很多人在mysql通过explain获取查询执行计划的信息问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2024-04-02
  • MySQL 5.7Explain执行计划
    小编给大家分享一下MySQL 5.7Explain执行计划,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!目录1. 介绍2. Ex...
    99+
    2024-04-02
  • 如何解读MySQL执行计划
    如何解读MySQL执行计划,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。EXPLAIN SELECT&nbs...
    99+
    2024-04-02
  • 使用MySQL的Explain执行计划的方法(SQL性能调优)
    目录前言1. explain的使用2. explain字段详解id列select_type列table列partitions列type列systemconsteq_refrefref...
    99+
    2022-11-13
    MySQL Explain执行计划 SQL性能调优
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作