explain和desc命令的效果相同,命令格式如下:

mysql> explain SELECT s.id sid, s.name sname , t.id tid ,t.name tname FROM student s LEFT  JOIN teacher t ON  s.name = t.name;
+----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                                              |
+----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+
|  1 | SIMPLE      | s     | index | NULL          | name | 768     | NULL |    3 | Using index                                        |
|  1 | SIMPLE      | t     | ALL   | NULL          | NULL | NULL    | NULL |   10 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+
2 rows in setmysql> desc SELECT s.id sid, s.name sname , t.id tid ,t.name tname FROM student s LEFT  JOIN teacher t ON  s.name = t.name;
+----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                                              |
+----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+
|  1 | SIMPLE      | s     | index | NULL          | name | 768     | NULL |    3 | Using index                                        |
|  1 | SIMPLE      | t     | ALL   | NULL          | NULL | NULL    | NULL |   10 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+
2 rows in set
mysql> explain student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  | MUL | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in setmysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  | MUL | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set

用于数据表:

mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  | MUL | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+Field:表中的字段名
Type:字段对应的类型
Null:可否为空
Key:键类型,主键、索引键。。。
Default:默认值
Extra:其他信息

用于sql:


mysql> explain SELECT s.id sid, s.name sname , t.id tid ,t.name tname FROM student s LEFT  JOIN teacher t ON  s.name = t.name;
+----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                                              |
+----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+
|  1 | SIMPLE      | s     | index | NULL          | name | 768     | NULL |    3 | Using index                                        |
|  1 | SIMPLE      | t     | ALL   | NULL          | NULL | NULL    | NULL |   10 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------------+id:查询的序列号select_type:查询的类型,普通查询、联合查询、子查询等table:输出行所引用的表名type:联合查询的访问类型,此属性比较重要possible_keys:表示能使用哪个索引在该表中找到行key:实际使用的索引键,如果没有索引被选择,键是NULLkey_len:实际使用的键长度ref:显示哪个字段或常数与key一起被使用进行查询rows:表示要遍历多少数据才能找到满足条件的数据,在innodb上是不准确的extra:附加信息

着重解释:

select_type字段:

SIMPLE 简单查询,不适用UNION或子查询
PRIMARY 最外层的SELECT
UNION UNION中的第二个或后面的SELECT语句
DEPENDENT UNION UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULT UNION的结果
SUBQUERY 子查询中的第一个SELECT
DEPENDENT SUBQUERY 子查询中的第一个SELECT,取决于外面的查询
DERIVED FROM子句的子查询

type字段:

SYSTEM 表中只有一行记录
CONST 表中最多只有一行匹配的记录,他在查询一开始就会被读取出来,被作为一个恒定值
EQ_REF 表中会有一行记录被读取出来和以前一个表中读取出来的记录做联合,这是最好的连接类型,他用在索引所有字段都用于做连接并且这个索引是primary key或unique类型
REF 表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录做联合,用于连接程序无法根据键值只取得一条记录的情况
REF_OR_NULL 和REF类似,在检索的时候会搜索NULL值的记录,经常用于子查询
UNIQUE_SUBQUERY 带in的子查询来代替ref
INDEX_SUBQUERY 用子查询来代替in
RANGE 只有在给定范围的记录才会被取出来,利用索引来取得一条记录,key字段表示使用了那个索引
INDEX 只扫描所引树
ALL 对表做全部扫描,应尽量避免

extra字段:

DISTINCT 找到当前记录的匹配联合结果的第一条记录之后,不再搜索其他记录
NOT EXISTS 做一个left join优化,在当前表中找到和前一条记录符合left join条件后,就不再搜索更多的记录
RANGE CHECKED FOR EACH RECORD (INDEX MAP:#) 没有找到合适的可用的索引,取代的办法是:对于前一个表的每一个行连接,它会做一个校验以决定该使用那个索引,并且使用这个索引来从表中取得记录。
USING FILESORT 需要额外做一遍排序操作,以拍好的顺序取得记录,应尽量避免
USING INDEX 直接从索引树中的信息取得记录,不再去扫描实际的记录
USING TEMPORARY 创建临时表存储结果以完成查询,通常发生在查询时包含了group by和order by子句,应尽量避免
USING WHERE where子句将用来限制哪些记录匹配了下一个表或者发送到客户端

可通过上述对表和sql分析来进行对应的修改,以使得性能达到最优

25、sql分析命令explain和desc相关推荐

  1. dev gridcontrol 根据数据获取索引_MySQL 索引分析除了 EXPLAIN 还有什么方法?

    前言 对于非数据库开发人员而言,难以对MySQL源码进行分析或调试,接近一个黑盒,但MySQL提供了一些命令及系统状态变量,可对索引及其他内容进行分析.掌握这些方法后,可以尽量深入地了解MySQL的一 ...

  2. MySQL 索引分析除了 EXPLAIN 还有什么方法?

    作者 | adrninistrat0r 责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 前言 对于非数据库开发人员而言,难以对MySQL源码进行分析或调试,接近一个黑盒,但MySQL提供 ...

  3. ORACLE SQL*PLUS 命令大全

    来源:http://www.cnblogs.com/kerrycode/archive/2011/06/09/2076248.html ---1: HELP INDEX HELP 命令查询相关命令的信 ...

  4. MySQL系列-高级-性能分析工具-EXPLAIN

    MySQL系列-高级-性能分析工具-EXPLAIN 1. EXPLAIN概述 1.1 官网介绍 1.2 EXPLAIN 基本语法 2. 基于函数和存储过程插入数据 2.1 创建表 2.2 创建函数和过 ...

  5. Linux中 oracle SQL*PLUS 命令大全

    http://www.cnblogs.com/kerrycode/archive/2011/06/09/2076248.html ORACLE SQL*PLUS 命令大全 2011-06-09 23: ...

  6. 经典MySQL语句大全和常用SQL语句命令的作用。

    转载自 http://blog.csdn.net/suyu_yuan/article/details/51784893 转自网络: 经典MSSQL语句大全和常用SQL语句命令的作用  下列语句部分是M ...

  7. Oracle杂谈二 SQL*PLUS命令的使用大全

    Oracle的sql*plus是与oracle进行交互的客户端工具.在sql*plus中,可以运行sql*plus命令与sql*plus语句. 我们通常所说的DML.DDL.DCL语句都是sql*pl ...

  8. MySQL SQL 优化命令行问题 SQL 抓取方式

    墨墨导读:优化的道路永无止境. 对于数据库来说安装,部署几乎是一次性的.后期的管理和优化是持续性的工作. 对于MySQL来说,可以说90%问题都在SQL语句上面.从问题SQL的筛选和优化,在MySQL ...

  9. explain ref_MySQL 性能分析神器 —— EXPLAIN 用法与解读。

    ↑ 点击上面 "时代Java"关注我们,关注新技术,学习新知识! EXPLAIN作为MySQL的性能分析神器,读懂其结果是很有必要的,然而我在各种搜索引擎上竟然找不到特别完整的解读 ...

最新文章

  1. Cpp 对象模型探索 / 虚函数的调用方式
  2. Vue-cli 项目优化归纳(打包、源码、用户体验)
  3. oracle几何体数据类型,Oracle数据库之spatial操作geometry方法
  4. 一个border引发的血案
  5. 基于 Docker 中的 MongoDB 授权使用
  6. 邓迪大学计算机专业,邓迪大学计算机科学本科专业申请.pdf
  7. java 反射 动态_java实现反射,动态配置
  8. python猜数字游戏_C++编程基础: 9. 猜数字小游戏
  9. php mysql数据库同步_教你怎样在两台MySQL数据库间实现同步
  10. 计算机科学中的张量,杨晓伟教授到我院做“张量学习的几个关键问题”学术报告...
  11. Python数据分析之股票数据
  12. select into 时有无strict关键字的区别
  13. _ETHREAD断链 —— 实现线程隐藏
  14. 嵌入式开发(二):开发板配置(自用)
  15. NEON intrinsics 函数模式介绍
  16. avalonia 控件TextBox 及其他控件文本改变事件
  17. 业务日志告警如何做?
  18. openfire入门
  19. 原生JS--增删改查
  20. shell脚本-eval的用法

热门文章

  1. java 毕向东 内部类_java基础内部类(毕向东老师)
  2. python购物车典例_Python入门:购物车实例
  3. 怎么判断再一个局域网内一个ip被两台机器占用_交换机与 VLAN 到底是怎么来的...
  4. python 复制文件_python 复制文件
  5. [SpringBoot2]HelloWorld
  6. C++ vector容器中用erase函数和迭代器删除重复元素问题分析
  7. 高等数学下-赵立军-北京大学出版社-题解-练习10.4
  8. [Java基础]增强for循环
  9. 2019年第十届蓝桥杯国赛B组试题A-平方序列-枚举
  10. Zookeeper实践与应用- Canal