首页 > 数据库 >MySQL 执行计划分析

MySQL 执行计划分析

时间:2023-04-18 13:42:09浏览次数:33  
标签:ref 查询 索引 计划 MySQL Using 执行 where id


一、 获取方法与阅读顺序

1. 获取方法

注意这个执行计划只是预估的

explain sql语句
--或者
desc sql语句

MySQL 执行计划分析_mysql

2. 阅读顺序

  • id值相同:从上往下顺序执行(下图为 tc -> c -> t)

一般越小或者返回值越少的表会越先被执行,这样才能保证后面关联时外层查询结果尽量小,内层查询被循环次数少

MySQL 执行计划分析_mysql_02

  • id值不同:越大越先执行(下图为 c -> t -> tc)

MySQL 执行计划分析_子查询_03

  • id有相同有不同:规则不变,先看id大的,id相同的从上往下看(下图为 c -> tc -> t)

MySQL 执行计划分析_字段_04

二、 执行计划各字段详解

1. select_type

常见值如下:

  • Primary:主查询,sql中的最外层
  • Subquery:子查询
  • Simple:不含子查询及union

MySQL 执行计划分析_子查询_05

  • Derived:衍生查询,查询时用到了临时表

例如,Form子查询中只有一张表,可以看到id=1的table部分是临时表<Derived2>,其中的2是指id=2的表为衍生表

MySQL 执行计划分析_数据库_06

再如,Form子查询中有两张表且使用了union,则左表就是Derived表,右表为union

MySQL 执行计划分析_数据库_07

  • Union与union result,参考上例

2. Table

该步用到的表,也可能是Derived表或者union,参考上例

3. Type

查询(索引)类型。常见含义及性能排序为:System(理想情况)>const(理想情况)>eq_ref(理想情况)>ref>range>index>all,除了all之外其他type均要求表有索引。

  • System:只有一条数据的系统表,或衍生表只有一条数据的主查询

MySQL 执行计划分析_数据库_08

MySQL 执行计划分析_字段_09

  • Const:通过主键或唯一索引查询返回一条数据

MySQL 执行计划分析_数据库_10

  • eq_ref:对于每个索引键的查询返回匹配的唯一行数据(即返回值无重复,常见于主键和唯一性索引)

MySQL 执行计划分析_sqlserver_11

  • Ref:对于每个索引键的查询返回匹配的任意行数据(1除外,1就是eq_ref)

MySQL 执行计划分析_mysql_12

  • Range:索引范围扫描,where后面是一个范围查询

MySQL 执行计划分析_数据库_13

  • Index:索引全扫描,相当于SqlServer index scan

MySQL 执行计划分析_子查询_14

  • All:全表扫描

MySQL 执行计划分析_mysql_15

4. possible_keys

表有多个索引时,该查询可能用到的索引,预测值,不一定准(例如下面第一个图的例子就不准)

5. key

实际用到的索引,null就是没用索引

MySQL 执行计划分析_子查询_14

MySQL 执行计划分析_sqlserver_17

6. Key_len

索引的长度,常用于判断复合索引是否完全被使用(条件完全一致)。如果索引字段可为null,会使用1个字节用于标识;若是可变长度varchar,会使用2个字节用于标识。

MySQL 执行计划分析_字段_18

7. Ref

指明当前表参照的字段(关联或where条件的过滤值),若参照值为常量,则为const。注意字段必须有索引才会有值,否则会为null,例如下面c表tid没有索引时,ref为null。

MySQL 执行计划分析_sqlserver_19

添加索引后则为t.tid,即其参照的列

MySQL 执行计划分析_子查询_20

8. Rows

使用索引预估查询到的行数,不一定准。

MySQL 执行计划分析_字段_21

9. Extra

备注信息,查询是否用到了文件排序、临时表、覆盖索引,是否需要回表等,有值时建议关注。

  • Using filesort:sql需要额外的排序(查询),where和order by不是同一字段会出现。单列索引建议where哪些字段就order by哪些字段;复合索引建议只使用左前缀列

MySQL 执行计划分析_字段_22

若使用复合索引,where与order by间不能跨列,也不能不用先导列

MySQL 执行计划分析_数据库_23

MySQL 执行计划分析_数据库_24

只使用左前缀列,可以避免排序

MySQL 执行计划分析_sqlserver_25

  • Using temporary:用到了临时表,常见于group by

MySQL 执行计划分析_mysql_26

  • Using index:覆盖索引,不需回表,一般较高效

如果有where条件,索引会出现在key和possible_keys中;如果没有where条件,索引只会出现在key中

MySQL 执行计划分析_数据库_27

  • Using where:需要回表查询,Using index和Using where可以同时出现(例如上例图1,因为条件是or,a1字段不需回表但a2需要回表)
  • Impossible where:where中条件永假

MySQL 执行计划分析_数据库_28

  • Using join buffer:使用连接缓存,一般sql性能有问题

例如最开始那个例子,三个表都没有索引,可能会把值放入内存中然后进行join

MySQL 执行计划分析_sqlserver_17

标签:ref,查询,索引,计划,MySQL,Using,执行,where,id
From: https://blog.51cto.com/u_13631369/6203154

相关文章

  • Ubuntu下安装及配置MySQL
    与在centos下安装相比多很多坑,不建议用。 一、软件安装Ubuntu下有两种常用方式apt-get方式(类似于yum)deb包方式安装(类似于rpm包)1.下载并解压软件下载地址:http://dev.mysql.com/downloads/mysql/这个tar包里包含mysql软件所有deb软件包创建安装目录:mkdir/usr/local/mysql将.tar文......
  • Mysql数据库-DQL操作
    DQL是数据查询语言(DataQueryLanguage)的缩写,是一种用于从数据库中检索数据的编程语言。DQL是SQL(结构化查询语言)的子集,用于查询关系型数据库,例如MySQL、Oracle和SQLServer等。DQL提供了多种查询操作,如SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等。使用这些操作,可以根据......
  • SqlServer 从执行计划缓存发现问题sql
    注意以下sql都较复杂,在数据库中执行时间可能较长,不要执行过于频繁。一、隐式转换sql版本1--找到含有隐式转换且会导致indexseek变为indexscan的语句–findalltheplansandquerywhicharebeingcomparedwithwrongdatatypeinqueriesandthuscasuingtheconversio......
  • MySQL并行导入导出工具——mysqlpump
    一、 mysqlpump简介mysql官方从5.7开始推出了mysqlpump工具,它和mysqldump一样属于逻辑备份。1.优点基于表并行备份数据库和数据库中对象,加快备份过程。(--default-parallelism)更好地控制数据库和数据库对象(表,存储过程,用户帐户)的备份。备份用户账号作为帐户管理语句(CREATEUSER,GRAN......
  • mysql锁及锁出现总结
    转载请注明出处:1.按锁粒度分类:行锁:锁某行数据,锁粒度最小,并发度高;;行锁是指加锁的时候锁住的是表的某一行或多行记录,多个事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问;行锁是对所有行级别锁的一个统称,比如下面说的记录锁、间隙锁、临键锁都是属于行锁表锁:锁整张......
  • 测试环境治理之MYSQL索引优化篇
    作者:京东物流 李光新1治理背景测试环境这个话题对于开发和测试同学一定不陌生,大家几乎每天都会接触。但是说到对测试环境的印象,却鲜有好评:•环境不稳定,测试五分钟,排查两小时•基础建设不全,导致验证不充分,遗漏缺陷•多人共用,节点堵塞这些问题在行业内其实屡见不鲜,针对测试环境的......
  • postgresql -- 执行计划
    一、显示执行计划pg中explain命令格式如下explain[options]sql语句例如explainselect*fromtest;explain(formatxml)select*fromtest;explain(analyzetrue,bufferstrue)select*fromtest;options可选项如下:ANALYZE(默认FALSE):实际执行sql,显示真实的执行计划及......
  • MyBatis-使用注释方法执行操作案例-2023-04-18
    第一步:编写工具类,注意openSession参数如增加true,则为事务自动提交packagecom.feijian.utils;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.sess......
  • MySQL导入导出 —— mysqldump 简介及常见用法
    一、导出导出用户需要有导出对象的权限,例如导出表要有select权限、导出视图要有showview权限、导出触发器要有trigger权限、需要锁表时要有locktables权限等。如果dump文件中包含了GTID信息,则无法导入到未启用GTID的数据库(低于5.6.9版本的数据库不支持GTID,因此也无法导入到这些......
  • oracle 为sql寻找更好的执行计划并绑定
    这种方法只适合sql本身有更好的执行计划,不能绑定自己构造的执行计划(比如加hint),并且每次只能针对一个sql_id,如果慢sql未使用绑定变量导致有很多类似sql最好从索引、sql改写等方面优化。首先找到慢sql的sql_id,查看其各执行计划平均执行时间--可用v$active_session_history,dba_hist_a......