转载:http://chenzehe.iteye.com/blog/1682081

MySQL可以通过EXPLAIN或DESC来查看并分析SQL语句的执行情况,如下需要计算2006年所有公司的销售额,需要关联sales表和company表,并且对money字段做求和操作,相应SQL如下:

Sql代码  
  1. EXPLAIN SELECT SUM(money) FROM sales s,company c WHERE s.company_id=c.id AND s.year=2006 \G;
  2. *************************** 1. row ***************************
  3. id: 1
  4. select_type: SIMPLE
  5. table: s
  6. type: ALL
  7. possible_keys: NULL
  8. key: NULL
  9. key_len: NULL
  10. ref: NULL
  11. rows: 1000
  12. Extra: Using where
  13. *************************** 2. row ***************************
  14. id: 1
  15. select_type: SIMPLE
  16. table: c
  17. type: ref
  18. possible_keys: index_company_id
  19. key: index_company_id
  20. key_len: 5
  21. ref: sakila.c.company_id
  22. rows: 1
  23. Extra: Using where; Using index

列的说明:

select_type: 表示SELECT的类型,常见的有下面几种

SIMPLE: 简单表,不使用连接或子查询的

PRIMARY: 主查询,即外层的查询

UNION: UNION中的第二个或者后面的查询语句

SUBQUERY: 子查询中的第一个SELECT

table: 输出结果集的表

  type: 表示表的连接类型,性能由好到差的连接类型为下面顺序

 system: 表中只有一行,即常量表

const: 单表中最多有一个匹配行,如primary key或unique index

 eq_ref: 对于前面的每一行,在此表中只查询一条记录,也就是多表连接中使用primary key或unique index

ref: 与eq_ref类似,区别在于不是使用primary key或unique index,而是使用普通索引

ref_or_null: 与ref类型,区别在于条件中包含对null的查询

 index_merge: 索引合并优化

unique_subquery: in的后面是一个查询主键字段的子查询

  index_subquery: 与unique_subquery类似,区别在于in的后面是查询非唯一索引字段的子查询

 range: 单表中的范围查询

 index: 对于前面的每一行,都通过查询索引来得到数据

 all: 对于前面的每一行,都通过扫描全表来得到数据

possible_keys: 查询时可能用到的索引

key: 查询时实际使用到的索引

 key-len: 索引字段的长度

 rows: 扫描行的数量

Extra: 执行情况的说明和描述

通过EXPLAIN的分析,确认在上面的例子中是对sales表的全表扫描导致效率不理想,通过对sales表创建索引:

Sql代码  
  1. CREATE INDEX index_sales_year ON sales(year);

创建索引后,再对该查询语句分析如下:

Sql代码  
  1. EXPLAIN SELECT SUM(money) FROM sales s,company c WHERE s.company_id=c.id AND s.year=2006 \G;
  2. *************************** 1. row ***************************
  3. id: 1
  4. select_type: SIMPLE
  5. table: s
  6. type: ref
  7. possible_keys: index_seles_year
  8. key: index_sales_year
  9. key_len: 2
  10. ref: const
  11. rows: 1
  12. Extra: Using where
  13. *************************** 2. row ***************************
  14. id: 1
  15. select_type: SIMPLE
  16. table: c
  17. type: ref
  18. possible_keys: index_company_id
  19. key: index_company_id
  20. key_len: 5
  21. ref: sakila.c.company_id
  22. rows: 1
  23. Extra: Using where; Using index

MySQL查询分析器EXPLAIN或DESC的更多相关文章

  1. Mysql中的explain和desc

    查询分析器 desc 和 explain 作用基本一样,explain速度快一点 explain 一条SQL语句出出现以下参数, 其中id,select_type,table 用于定位查询,表示本行参 ...

  2. 如何看MySql执行计划explain(或desc)

    简介 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化.EXPLAIN 命令用法十分简单, 在 S ...

  3. mysql查询语句分析 explain/desc用法

    explain或desc显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. explain 数据表 或 desc 数据表 显示数据表各字段含义 ...

  4. MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介

    网站或服务的性能关键点很大程度在于数据库的设计(假设你选择了合适的语言开发框架)以及如何查询数据上. 我们知道MySQL的性能优化方法,一般有建立索引.规避复杂联合查询.设置冗余字段.建立中间表.查询 ...

  5. mysqldumpslow 分析slow query日志和explain分析mysql查询结构

    mysqldumpslow的使用:比如我们要查询按时间返回前5条日志信息,格式如下:mysqldumpslow -s t -t 5 /var/log/mysql/slowquery_20180303. ...

  6. MySQL查询优化之explain的深入解析

    在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.expla ...

  7. MySQL执行计划 EXPLAIN参数

    MySQL执行计划参数详解 转http://www.jianshu.com/p/7134286b3a09 MySQL数据库中,在SELECT查询语句前边加上“EXPLAIN”或者“DESC”关键字,即 ...

  8. MySQL查询性能优化---高性能(二)

    转载地址:https://segmentfault.com/a/1190000011330649 避免向数据库请求不需要的数据 在访问数据库时,应该只请求需要的行和列.请求多余的行和列会消耗MySql ...

  9. MySQL 优化之 EXPLAIN 关键字

    MySQL查询优化之explain的深入解析 0. 准备 首先执行如下的 sql 语句: CREATE TABLE IF NOT EXISTS `article` (`id` int(10) unsi ...

随机推荐

  1. __PUBLIC__ 路径更改

    config.php 'TMPL_PARSE_STRING' => array( '__PUBLIC__' => __ROOT__ . '/' . APP_NAME . '/Tpl/Pub ...

  2. 我的第一个开源项目-logger4Net

    学会学习,学会分享,学会创造. 这我的第一个开源项目.以前总觉得开源离自己很远,但通过不断学习发现,其实自己已经走在这条路上.思想就在那,只要懂得学习,懂得分享,就会懂享受创造的快乐感与殷实感. 没做 ...

  3. Linux超快速安装Ruby on Rails

    Linux超快速安装Ruby on Rails 时间 2014-11-25 11:45:11 Flincllck Talk 原文  http://www.flincllck.com/quick-ins ...

  4. .net之工作流工程展示及代码分享(四)主控制类

    现在应该讲主控制类了,为了不把系统弄得太复杂,所以就用一个类作为主要控制类(服务类),作为前端.后端.业务逻辑的控制类. WorkflowService类的类图如下: 该类的构造函数: public ...

  5. C语言回顾-整型变量修饰符和一维数组

    1.整型变量修饰符 1)改变整型变量的存储空间 #include <stdio.h> int main(int argc, const char * argv[]) { //改变整型变量占 ...

  6. 前端开发--面试题整理(JS篇)

    1.截取字符串abcdace的acealert('abcdace'.substring(4)); 2.规避javascript多人开发函数重名问题命名空间封闭空间js模块化mvc(数据层.表现层.控制 ...

  7. ios学习-控制按钮图片的走动和变换

    一.项目要求:制作一个界面,通过点击按钮来控制头像(按钮)向上,向下,向左,向右移动,可以左旋转,右旋转,以及放大和缩小. 二.开发步骤: 1.通过拖动按钮到storyboard搭建UI界面(后面会写 ...

  8. 判断是否IPv6网络

    bool isIPV6Net(const std::string ip_v4, std::string& out_ip) { bool is_v6 = false; struct addrin ...

  9. 安装win7的那些事

    由于win7系统只支持MBR格式的分区,如果强行将win7安装到UEFI分区方式的硬盘上将不能启动,所以,如果你要给别人的win8或者win10的OEM系统安装win7的话,记得先将重要数据备份出去, ...

  10. Nginx的安装配置

    1.安装PCRE库 $ cd /usr/local/ $ https://sourceforge.net/projects/pcre/files/pcre/8.36/ $ tar -zxvf pcre ...