烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长。如何写好sql,学会看执行计划至关重要。下面我简单讲讲mysql的执行计划,只列出了一些常见的情况,希望对大家有所帮助。

测试表结构:

CREATE TABLE `t1` (

`c1` int(11) NOT NULL DEFAULT '0',

`c2` varchar(128) DEFAULT NULL,

`c3` varchar(64) DEFAULT NULL,

`c4` int(11) DEFAULT NULL,

PRIMARY KEY (`c1`),

KEY `ind_c2` (`c2`),

KEY `ind_c4` (`c4`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `t2` (

`c1` int(11) NOT NULL DEFAULT '0',

`c2` varchar(128) DEFAULT NULL,

`c3` varchar(64) DEFAULT NULL,

`c4` int(11) DEFAULT NULL,

PRIMARY KEY (`c1`),

KEY `ind_c2` (`c2`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `t3` (

`c1` int(11) NOT NULL DEFAULT '0',

`c2` varchar(128) DEFAULT NULL,

`c3` varchar(64) DEFAULT NULL,

`c4` int(11) DEFAULT NULL,

PRIMARY KEY (`c1`),

KEY `ind_c2` (`c2`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1.查看mysql执行计划

explain  select ......

2.执行计划包含的信息

(1).id

含义,指示select字句或操作表的顺序。

eg1:id相同,执行顺序从上到下,下面的执行计划表示,先操作t1表,然后操作t2表,最后操作t3表。

eg2:若存在子查询,则子查询(内层查询)id大于父查询(外层查询),先执行子查询。id越大,优先级越高。

(2).select_type

含义:select语句的类型

类型:

a.SIMPLE:查询中不包含子查询或者UNION

b.查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY

c.在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY

d.在FROM列表中包含的子查询被标记为:DERIVED(衍生)

e.若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在  FROM子句的子查询中,

外层SELECT将被标记为:DERIVED

f.从UNION表获取结果的SELECT被标记为:UNION RESULT

eg:

id为1的table显示,表示结果来源于衍生表2。

id为2表示子查询,读取t3表

id为3类型为union,是union的第二个select,最先执行;

id为NULL的类型为union result, 表示id为1的操作和id为3的操作进行结果集合并。

执行顺序3->2->1->NULL

(3).type

含义:获取记录行采用的方式,亦即mysql的访问方式。

a.ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

b.index:Full Index Scan,index与ALL区别为index类型只遍历索引,索引一般比记录要小。

因为索引中含有c1,查询c1,c2可以通过索引扫描实现。

c.range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、等的查询

备注:range类型肯定是使用了索引扫描,否则type为ALL

d.ref:非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找

t2.c4为非唯一索引

e.eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描

t2.c1为主键索引,主键索引也是唯一索引

f.const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,

MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下, 使用system

(4).possible_keys

含义:指出MySQL能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用

(5).key

含义:显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL

(6)key_len

含义:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度

(7)ref

含义:用于连接查询,表示具体某个表的某列被引用

(8)rows

含义:MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,这个值是不准确的,只有参考意义。

(9)Extra

含义:显示一些辅助的额外信息

a.Using index,表示使用了索引

b.Using where,表示通过where条件过滤

c.Using temporary,表示使用了临时表,常见于分组和排序

d.Using filesort,表示无法使用索引排序,需要文件排序

eg1:t1.c3列没有索引

eg2:使用索引列t1.c2

Mysql执行计划含义,mysql执行计划介绍相关推荐

  1. mysql explain字段含义,MySQL(十七):EXPLAIN 输出信息之 Extra 字段解释

    Child of 'table' pushed join@1 (JSON: message text) This table is referenced as the child of table i ...

  2. mysql explain字段含义,Mysql explain中的关键字段(通俗易懂篇)

    作者:可爱猪猪 - 帅锅一枚 作者的网名很阔爱,如果喜欢本文章一定要点 喜欢 或者 打赏,拜托~ 作者一直在进步,需要你们的支持和鼓励,谢谢! 人生理想:在程序猿界混出点名堂! 请读者,认真读完这篇文 ...

  3. mysql explain insert_MySQL之EXPLAIN 执行计划详解

    explain 可以分析 select语句的执行,即 MySQL 的"执行计划. 一.type 列 MySQL 在表里找到所需行的方式.包括(由左至右,由最差到最好):| All | ind ...

  4. mysql 定时脚本_MySQL定时执行脚本(计划任务)命令实例

    在mysql中我们可以直接进行一些参数设置让它成定时为我们执行一些任务了,这个虽然可以使用windows或者linux中的计划任务实现,但是mysql本身也能完成 查看event是否开启 复制代码 代 ...

  5. mysql 执行计划不对_MySQL执行计划显示与执行过程不符合

    一 建表和现象的过程如下 CREATE TABLE t1 (id1 INT, a1 INT, b1 INT, PRIMARY KEY(id1)); CREATE TABLE t3 (id3 INT U ...

  6. MySQL(三)——SQL执行计划分析

    目录 一.SQL执行计划概述 二.explain字段详解 1.id 2.select_type 3.possible_keys 4.key 5. key_len 6.ref 7.rows 8.Extr ...

  7. mysql 执行计划extra_SQL优化 MySQL版 -分析explain SQL执行计划与Extra

    Extra 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:此文章必须有一定的Mysql基础,或观看执行计划入门篇传送门: https://www.cnblogs.com/Sta ...

  8. MySQL执行计划(MySQL调优的重要利器)

    文章目录 看完本篇文章你能学到什么? 一.MySQL执行计划 1.1 id字段 1.2 select_type 字段 1.3 table 字段 1.4 partitions 字段 1.5 type字段 ...

  9. Mysql执行计划和Mysql优化

    1. 执行计划 1.1. 执行计划概念 执行计划是什么:使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的. 作用:分析你的查询语句或是表结构的性能 ...

最新文章

  1. 【FFmpeg】AVPacket的使用详解
  2. 深度学习不work?这有一份超全的Debug检查清单
  3. 中国AI专利申请量占全球74%,腾讯、百度、OPPO前五
  4. Java开发必须掌握的线上问题排查命令
  5. visual studio 64位汇编 listing列表文件
  6. 你所接触的计算机网络,学计算机网络的进
  7. map以及类似指针iterator
  8. java的源代码文件扩展名_【单选题】Java 的源代码文件具有( )的扩展名 (5.0分) A. .c B. .class C...
  9. oracle z中rowid,oracle 10g中的ROWID
  10. 1.java的基础和数据类型
  11. mysql.sock问题
  12. libevent: evbuffer缓冲
  13. 逐步回归 图像降维matlab,使用matlab对训练样本图像降维,并对测试图像使用变换矩阵降维并重构...
  14. js设计模式之观察者模式和发布/订阅模式
  15. IntelliJ IDEA快速自动生成Junit测试类
  16. 1.MongoDB入门详解
  17. 等式约束凸二次规划问题的解法
  18. 装饰者模式 增加功能;动态代理减少功能 只要完成自己部分功能 (繁杂部分交给他人处理)...
  19. 实践:Linux上安装nginx后同一服务器进行多域名反向代理
  20. 图像属性——老照片特效

热门文章

  1. scala集合中添加元素_如何在Scala中获得列表的第一个元素?
  2. 字符串查找字符出现次数_查找字符串作为子序列出现的次数
  3. path r'c test.html',robot framework - robot命令参数解析
  4. php映射,PHP实现路由映射到指定控制器
  5. 以下不属于计算机安全术语,基础知识(D).doc
  6. 加餐:Redis 的可视化管理工具
  7. Windows 7 设置devenv.exe启动版本
  8. Ubuntu18 Win10搭建Caffe训练识别mnist手写数字demo
  9. 使用mysqldump 导出sql数据
  10. NLP大神推荐的机器学习入门书单(附大量百度网盘电子书)