mysql explain的作用是模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理用户的SQL语句,提高数据检索效率,降低数据库的IO成本。

mysql explain的作用是:

模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。mysql> explain select * from tb_user;

+----+-------------+---------+------+---------------+------+---------+------+------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+---------+------+---------------+------+---------+------+------+-------+

| 1 | SIMPLE | tb_user | ALL | NULL | NULL | NULL | NULL | 1 | NULL |

+----+-------------+---------+------+---------------+------+---------+------+------+-------+

(一)id列:(1)、id 相同执行顺序由上到下

mysql> explain

-> SELECT*FROM tb_order tb1

-> LEFT JOIN tb_product tb2 ON tb1.tb_product_id = tb2.id

-> LEFT JOIN tb_user tb3 ON tb1.tb_user_id = tb3.id;

+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+

| 1 | SIMPLE | tb1 | ALL | NULL | NULL | NULL | NULL | 1 | NULL |

| 1 | SIMPLE | tb2 | eq_ref | PRIMARY | PRIMARY | 4 | product.tb1.tb_product_id | 1 | NULL |

| 1 | SIMPLE | tb3 | eq_ref | PRIMARY | PRIMARY | 4 | product.tb1.tb_user_id | 1 | NULL |

+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+

(2)、如果是子查询,id序号会自增,id值越大优先级就越高,越先被执行。

mysql> EXPLAIN

-> select * from tb_product tb1 where tb1.id = (select tb_product_id from tb_order tb2 where id = tb2.id =1);

+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+

| 1 | PRIMARY | tb1 | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL |

| 2 | SUBQUERY | tb2 | ALL | NULL | NULL | NULL | NULL | 1 | Using where |

+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+

(3)、id 相同与不同,同时存在

mysql> EXPLAIN

-> select * from(select * from tb_order tb1 where tb1.id =1) s1,tb_user tb2 where s1.tb_user_id = tb2.id;

+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+

| 1 | PRIMARY | | system | NULL | NULL | NULL | NULL | 1 | NULL |

| 1 | PRIMARY | tb2 | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL |

| 2 | DERIVED | tb1 | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL |

+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+

derived2:衍生表 2表示衍生的是id=2的表 tb1相关学习推荐:mysql视频教程

(二)select_type列:数据读取操作的操作类型

1、SIMPLE:简单的select 查询,SQL中不包含子查询或者UNION。

2、PRIMARY:查询中包含复杂的子查询部分,最外层查询被标记为PRIMARY

3、SUBQUERY:在select 或者WHERE 列表中包含了子查询

4、DERIVED:在FROM列表中包含的子查询会被标记为DERIVED(衍生表),MYSQL会递归执行这些子查询,把结果集放到零时表中。

5、UNION:如果第二个SELECT 出现在UNION之后,则被标记位UNION;如果UNION包含在FROM子句的子查询中,则外层SELECT 将被标记为DERIVED

6、UNION RESULT:从UNION表获取结果的select

(三)table列:该行数据是关于哪张表

(四)type列:访问类型由好到差system > const > eq_ref > ref > range > index > ALL

1、system:表只有一条记录(等于系统表),这是const类型的特例,平时业务中不会出现。

2、const:通过索引一次查到数据,该类型主要用于比较primary key 或者unique 索引,因为只匹配一行数据,所以很快;如果将主键置于WHERE语句后面,Mysql就能将该查询转换为一个常量。

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

4、ref:非唯一索引扫描,返回匹配某个单独值得所有行,本质上是一种索引访问,它返回所有匹配某个单独值的行,就是说它可能会找到多条符合条件的数据,所以他是查找与扫描的混合体。

详解:这种类型表示mysql会根据特定的算法快速查找到某个符合条件的索引,而不是会对索引中每一个数据都进行一 一的扫描判断,也就是所谓你平常理解的使用索引查询会更快的取出数据。而要想实现这种查找,索引却是有要求的,要实现这种能快速查找的算法,索引就要满足特定的数据结构。简单说,也就是索引字段的数据必须是有序的,才能实现这种类型的查找,才能利用到索引。

5、range:只检索给定范围的行,使用一个索引来选着行。key列显示使用了哪个索引。一般在你的WHERE 语句中出现between 、< 、> 、in 等查询,这种给定范围扫描比全表扫描要好。因为他只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。

6、index:FUll Index Scan 扫描遍历索引树(index:这种类型表示是mysql会对整个该索引进行扫描。要想用到这种类型的索引,对这个索引并无特别要求,只要是索引,或者某个复合索引的一部分,mysql都可能会采用index类型的方式扫描。但是呢,缺点是效率不高,mysql会从索引中的第一个数据一个个的查找到最后一个数据,直到找到符合判断条件的某个索引)。

7、ALL:全表扫描 从磁盘中获取数据 百万级别的数据ALL类型的数据尽量优化。

(五)possible_keys列:显示可能应用在这张表的索引,一个或者多个。查询涉及到的字段若存在索引,则该索引将被列出,但不一定被查询实际使用。

(六)keys列:实际使用到的索引。如果为NULL,则没有使用索引。查询中如果使用了覆盖索引,则该索引仅出现在key列表中。覆盖索引:select 后的 字段与我们建立索引的字段个数一致。

(七)ken_len列:表示索引中使用的字节数,可通过该列计算查询中使用的索引长度。在不损失精确性的情况下,长度越短越好。key_len 显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出来的。

(八)ref列:显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。

(九)rows列(每张表有多少行被优化器查询):根据表统计信息及索引选用的情况,大致估算找到所需记录需要读取的行数。

(十)Extra列:扩展属性,但是很重要的信息。1、 Using filesort(文件排序):mysql无法按照表内既定的索引顺序进行读取。

mysql> explain select order_number from tb_order order by order_money;

+----+-------------+----------+------+---------------+------+---------+------+------+----------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+----------+------+---------------+------+---------+------+------+----------------+

| 1 | SIMPLE | tb_order | ALL | NULL | NULL | NULL | NULL | 1 | Using filesort |

+----+-------------+----------+------+---------------+------+---------+------+------+----------------+

1 row in set (0.00 sec)

说明:order_number是表内的一个唯一索引列,但是order by 没有使用该索引列排序,所以mysql使用不得不另起一列进行排序。

2、Using temporary:Mysql使用了临时表保存中间结果,常见于排序order by 和分组查询 group by。

mysql> explain select order_number from tb_order group by order_money;

+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+

| 1 | SIMPLE | tb_order | ALL | NULL | NULL | NULL | NULL | 1 | Using temporary; Using filesort |

+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+

1 row in set (0.00 sec)

3、Using index 表示相应的select 操作使用了覆盖索引,避免访问了表的数据行,效率不错。

如果同时出现Using where ,表明索引被用来执行索引键值的查找。

如果没有同时出现using where 表明索引用来读取数据而非执行查找动作。

mysql> explain select order_number from tb_order group by order_number;

+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+

| 1 | SIMPLE | tb_order | index | index_order_number | index_order_number | 99 | NULL | 1 | Using index |

+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+

1 row in set (0.00 sec)

4、Using where 查找

5、Using join buffer :表示当前sql使用了连接缓存。

6、impossible where :where 字句 总是false ,mysql 无法获取数据行。

7、select tables optimized away:

8、distinct:

mysql explain是什么意思_mysql explain的作用是什么?相关推荐

  1. mysql explain key为空_MySQL Explain详解

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...

  2. mysql和oracle执行计划_mysql explain执行计划详解

    原文链接:https://www.cnblogs.com/xiaoboluo768/p/5400990.html mysql> explain  select t1.kprq from    p ...

  3. mysql 执行计划详解_mysql explain执行计划详解

    备注:转载 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有: A:si ...

  4. mysql性能优化 洪斌_mysql explain分析

    expain出来的信息有10列,分别是id.select_type.table.type.possible_keys.key.key_len.ref.rows.Extra,下面对这些字段出现的可能进行 ...

  5. mysql range代表什么意思_MYSQL explain详解之range

    explain显示了MySQL如何使用索引来处理DML语句以及连接表,explain显示的信息可以帮助选择更好的索引和写出更优化的查询语句 2.EXPLAIN列的解释: table:显示这一行的数据是 ...

  6. mysql判断域为空_MySQL EXPLAIN 字段说明

    id 查询或关联查询的顺序. 如果没有子查询且只有一个查询,则为一个常数 1,表示第一步: 如果有子查询,则子查询为 1,父查询为 2: 相同的 id 查询顺序为自上而下: 如果有子查询,不同 id ...

  7. mysql中的执行计划_MySQL中的执行计划explain详解

    一.用法及定义: explain为sql的执行计划.在sql前面加上explain关键字即可 如:explain select * from tbl_emp; 名词解释: id:[操作表的顺序] 1. ...

  8. mysql explain不准确_mysql explain预估剖析

    引子: 使用MySQL建立了一张表country,总共有才3121行记录. 但是使用explain select count(*) from country;的时候,发现行数rows达到6897,让我 ...

  9. mysql explain 性能分析_Mysql explain用法和性能分析

    上次老大帮忙调整SQL的时候看到,经常用到explain,就自己学习下,数据库方面是弱项,急需有待加强啊.闲话不多说,步入正题: MySQL中EXPLAIN解释命令是显示mysql如何使用索引来处理s ...

最新文章

  1. hdu 2028 Lowest Common Multiple Plus
  2. 微信小程序云数据库触底分页加载,下拉无限加载,第一次请求数据随机,随机获取数据库的数据
  3. MPB:湖南师大尹佳组-​乳酸菌对酸和胆碱盐的耐受能力
  4. javaweb:servlet
  5. 王志成/王之泰《面向对象程序设计(java)》第十一周学习总结
  6. 科大星云诗社动态20210813
  7. QT绘制变焦线(Zoom Line)
  8. 大数据学习笔记30:搭建高可用Hadoop集群
  9. 关于线程上下文切换,你知道多少?
  10. Asp.Net高级知识回顾_HttpModule及应用程序生命周期_1
  11. Python还能走多远?
  12. docker创建mysql实例_使用docker创建mysql实例
  13. 有负数c语言除法,C语言负数的除法和求余运算
  14. 洛谷 P5708 【深基2.习2】三角形面积(C)
  15. 【NLP】第16章 使用RNN 和注意力的自然语言处理
  16. java.lang.ClassNotFoundException解决办法
  17. 说说远程团队协作的故事
  18. 区块链技术再出新玩法——解决跨境支付问题
  19. 程序人生——Hello P2P
  20. 瑞利、莱斯、高斯信道模型

热门文章

  1. opencv中图像直方图常见操作之直方图比较(二)
  2. JAVA作业——多线程抢红包
  3. 还做不做VC?别急着回答先看看这十个问题
  4. Python之爬虫系列之第一弹
  5. 数据结构-希尔排序(Java实现)
  6. 小米6没有开启位置服务器,小米6gps在哪打开
  7. 小米java后台面经
  8. java快速开发平台 二次开发 外包项目利器 springmvc SS-M后台框架源码 (转载)
  9. 苹果手机清灰_ROG手机2火爆?这几个缺点,买前必看
  10. Android ViewHolder工具