关于Explain

最近在对sql进行性能优化因此对explain相关的知识进行一个简单的整理归纳。

EXPLAIN:

  为SELECT语句中使用到的每个表返回一条 SELECT 执行的详细信息;按照MySQL在处理语句时读取它们的顺序列出这些表。

命令输出格式

id = 1
select_type = SIMPLE
table = clazz
partitions =
type = const
possible_keys = PRIMARY
key = PRIMARY
key_len = 98
ref = const
rows = 1
filtered = 100.00
Extra =     
  • id:SELECT 标识符,SQL执行的顺序的标识,SQL从大到小的执行
    • id相同时,执行顺序由上至下
    • 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
    • 如果id相同,则认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
  • select_type
    • SIMPLE:简单的SELECT未使用 UNION 查询或子查询
    • PRIMARY:表示此查询是最外层的SELECT(如两表做UNION或者存在子查询的外层的表操作为PRIMARY,内层的操作为UNION)
    • UNION:表示UNION操作中,查询中处于内层的SELECT(内层的SELECT语句与外层的SELECT语句没有依赖关系)
    • DEPENDENT UNION:表示UNION操作中,查询中处于内层的SELECT(内层的SELECT语句与外层的SELECT语句有依赖关系)
    • UNION RESULT:UNION 操作的结果,id值通常为null
    • SUBQUERY:子查询中的第一个 SELECT
    • DEPENDENT SUBQUERY:子查询中的第一个 SELECT, 子查询依赖于外层的查询结果
    • ERIVED:被驱动的SELECT子查询(子查询位于from子句)
    • MATERIALZED:物化子查询(对此查询会创建临时表,将制定表物化为临时表)
    • UNCACHEABLE SUBQUERY:无法缓存子查询的结果,每次都需要计算
    • UNCACHEABLE UNION:UNION操作红内层的子查询无法被物化(类似于UNCACHABLESUBQUERY)
  • table:表示查询涉及的表或衍生表
  • type

    • ALL:全表扫描,mysql将便利全表数据直至找到匹配的行
    • index:全索引扫描,遍历索引树
    • range:  范围扫描,基于索引做扫描,如between,in,>=,like等操作
    • ref: 表示上述的连接匹配条件,即哪些列或产量被用于查找索引列上的值
    • eq_ref: 类似ref区别在于索引是唯一索引,对于每个索引键值表中只有一条记录匹配,即多表连接中使用primary key或者unique key作为关联条件
    • const: 只读取一次就能获得数据(如:主键)
    • system: const的特例,查询的表中只有一行的情况下,使用system
    • null: mysql在优化的过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里面选取最小值可以通过单独索引查找完成  
  • partitions:记录与查询匹配的分区
  • possible_keys:表示在查询时, 能够使用到的索引具体使用了哪些索引, 由 key 字段决定.
  • key:表示查询时所真正使用到的索引.
  • key_len:表示查询优化器使用了索引的字节数. 这个字段可以评估组合索引是否完全被使用, 或只有最左部分字段被使用到

    • 字符串

      • char(n): n 字节长度
      • varchar(n): 如果是 utf8 编码, 则是 3 n + 2字节; 如果是 utf8mb4 编码, 则是 4 n + 2 字节
    • 数值类型  
      • TINYINT: 1字节
      • SMALLINT: 2字节
      • MEDIUMINT: 3字节
      • INT: 4字节
      • BIGINT: 8字节
    • 时间类型 
      • DATE: 3字节
      • TIMESTAMP: 4字节
      • DATETIME: 8字节
    • 字段属性: NULL 属性 占用一个字节. 如果一个字段是 NOT NULL 的, 则没有此属性.
  • ref:被用来标识那些用来进行索引比较的列或者常量
  • rows:估算 SQL 要查找到结果集需要扫描读取的数据行数
  • filterd:给出了一个百分比的值,这个百分比值和 rows 列的值一起使用
  • Extra: 附加与操作相关联的信息
    • Using filesort
      • 表示 MySQL 需额外的排序操作, 不能通过索引顺序达到排序效果,查询 CPU 资源消耗大建议优化去掉,
    • Using index
      • "覆盖索引扫描", 表示查询在索引树中就可查找所需数据, 不用扫描表数据文件, 往往说明性能不错
    • Using where
      • where条件用于筛选出与下一个表匹配的数据然后返回给客户端
    • Using temporary
      • 查询有使用临时表, 一般出现于排序, 分组和多表 join 的情况, 查询效率不高 建议优化.
    • Impossible where
      • WHERE条件过滤没有效果,或者是始终选不出任何列(理解为最终是全表扫描)
    • Impossible HAVING
      • HAVING条件过滤没有效果,或者是始终选不出任何列(理解为返回已有查询的结果集)
    • unique row not found
      • 表中找不到满足条件唯一索引或主键索引的列
    • Using sort_union(...),Using union(...),Using intersect(...)
      • 表示在index_merge的连接类型中索引合并是怎么样完成的,及使用了怎样特别的算法

原文地址:https://www.cnblogs.com/Onlywjy/p/12549368.html

时间: 2024-08-30 03:20:48

关于Explain的相关文章

explain(转)

官网:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 原文:http://blog.csdn.net/zhuxineli/article/details/14455029 explain显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 先解析一条sql语句,看出现什么内容 EXPLAINSELECTs.uid,s.username,s.name,f.email,f.

mysql慢查询优化之explain的各列含义

mysql> explain select customer_id,first_name,last_name from customer; +----+-------------+----------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra

MySQL的EXPLAIN的type

连接操作的类型 (1)SYSTEM CONST的特例,当表上只有一条元组匹配 (2)CONST WHERE条件筛选后表上至多有一条元组匹配时,比如WHERE ID = 2 (ID是主键,值为2的要么有一条要么没有) (3)EQ_REF 参与连接运算的表是内表(在代码实现的算法中,两表连接时作为循环中的内循环遍历的对象,这样的表称为内表). 基于索引(连接字段上存在唯一索引或者主键索引,且操作符必须是"="谓词,索引值不能为NULL)做扫描,使得对外表的一条元组,内表只有唯一一条元组与之

Explain语法

EXPLAIN SELECT -- 变体: 1. EXPLAIN EXTENDED SELECT -- 将执行计划"反编译"成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2. EXPLAIN PARTITIONS SELECT -- 用于分区表的EXPLAIN 执行计划包含的信息 id 包含一组数字,表示查询中执行select子句或操作表的顺序 id相同,执行顺序由上至下 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

MySQL优化—工欲善其事,必先利其器之EXPLAIN

转自:http://www.cnblogs.com/magialmoon/archive/2013/11/23/3439042.html mysql官方手册关于explain命名的说明文档:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_select_type 最近慢慢接触MySQL,了解如何优化它也迫在眉睫了,话说工欲善其事,必先利其器.最近我就打算了解下几个优化MySQL中经常用到的工具.今天就简单介绍下

Mysql之表的操作&索引&explain&profile

创建一个表create table(help create table) =>rename table A to B  更改表名 =>alter table A rename to B 更改表 =>drop table A   删除表 mysql> show create database gtms; #查看建库语句 +----------+---------------------------------------------------------------+ | Data

mysql explain详解

1,  数据类型隐式转换 与 查看是否使用了索引 2,select_type select类型,它有以下几种值 2.1 simple 它表示简单的select,没有union和子查询 2.2 primary 最外面的select,在有子查询的语句中,最外面的select查询就是primary, 3 table 输出的行所用的表,这个参数显而易见,容易理解 4 type 连接类型.有多个参数,先从最佳类型到最差类型介绍 重要且困难 4.1 system 表仅有一行,这是const类型的特列,平时不

Mysql Explain 详解

一.语法 explain < table_name > 例如: explain select * from t3 where id=3952602; 二.explain输出解释 +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+| id | select_type | table | type  | possible_keys     | key 

MySQL EXPLAIN Output Format(MySQL运维神技)

摘要: DBA经常会用到的explain来查看SQL语句的执行计划,今天小人斗胆,从MySQL 5.7 Reference Manual中把MySQL EXPLAIN Output Format翻译过来.欢迎拍砖 Explain语句提供了一个select语句执行计划的信息. Explain为每个用了select语句的表,返回一行信息.它列出了表中的顺序输出,MySQL会读取他们,然后再处理.MySQL解决了所有使用嵌套循环连接方法.这意味着MySQL会读取第一个表中的一行,然后在第二个表中找到一

mysql explain 中key_len的计算

今天丁原问我mysql执行计划中的key_len是怎么计算得到的,当时还没有注意,在高性能的那本书讲到过这个值的计算,但是自己看执行计划的时候一直都没有太在意这个值,更不用说深讨这个值的计算了: ken_len表示索引使用的字节数,根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段都被查询用到. 在查看官方文档的时候,也没有发现详细的key_len的计算介绍,后来做了一些测试,在咨询了丁奇关于变长数据类型的值计算的时候,突然想到innodb 行的格式,在这里的计算中有