转载自 mysql查询优化explain命令详解

mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式。explain翻译即解释,就是看mysql语句的查询解释计划,从解释计划我们能很清楚的看到解释的语句有没有合理用到索引,扫描了多少行数,有没有触及全表扫描、用到临时表等影响慢查询的原因。

使用很简单,如

explain select * from user ...

执行后会出现解释计划的表格,意义可参考下面的参数,针对这些解释计划,我们可以作为相对应的优化。

id    mysql查询标识符,即序号。

select_type    查询类型

  • simple:即简单select 查询,不包含union及子查询;

  • primary:最外层的 select 查询;

  • union:表示此查询是 union 的第二或随后的查询;

  • dependent union:union 中的第二个或后面的查询语句, 取决于外面的查询;

  • union result:union的结果;

  • subquery:子查询中的第一个select;

  • dependent subquery:子查询中的第一个select,取决于外面的查询,即子查询依赖于外层查询的结果。

table    所有查询到的表。

type    联接类型,比较重要的项,从这一项可以看出是否高效的重要依据

性能从好到坏依次如下:

  • system:表中只有一条数据,这是一个特殊的const 类型;

  • const:针对主键或唯一索引的等值查询扫描,最多只返回一行数据,const 查询速度非常快,因为它仅仅读取一次即可;

  • eq_ref:此类型通常出现在多表的 join 查询,表示对于前表的每一个结果,都只能匹配到后表的一行结果,并且查询的比较操作通常是=, 查询效率较高;

  • ref:此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了 最左前缀 规则索引的查询;

  • fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引;

  • ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多;

  • unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值;

  • index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重;

  • index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见and,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取所个索引,性能可能大部分时间都不如range;

  • range:表示使用索引范围查询,通过索引字段范围获取表中部分数据记录。这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN操作中,此时输出的 ref 字段为 NULL并且key_len字段是此次查询中使用到的索引的最长的那个;

  • index:全表扫描,只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序,但是开销仍然非常大,这种情况时, Extra 字段会显示 Using index;

  • all:性能最差的情况,使用了全表扫描,系统必须避免出现这种情况。

possible_keys    可能用到的索引。

key    真正用到的索引。

key_len    使用了索引字节的长度。

ref  显示索引的哪一列被使用了。

rows    扫描了多少行数,也是性能评估的重要依据。

extra 额度信息,常见的有以下几种。

  • Distinct:一旦找到了与行相联合匹配的行就不再搜索了;

  • Using filesort:使用了文件排序,性能非常慢,需要优化。

  • Using index:查询使用到了索引,列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候。

  • Using temporary:使用了临时表排序,性能非常慢,需要优化。

  • Using where:表示使用了where进行查询,不是很重要。

  • ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,需要优化。

具体的对执行计划解释可以参考msyql官网:

https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

扩展

另外,mysql5.6增加了对insert/update/delete的explain支持,用法一样。

mysql查询优化explain命令详解相关推荐

  1. MySQL调试--explain命令详解

    原文网址:MySQL调试--explain命令详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL的explain命令的用法及其结果的含义. explain作用 概述 在 SELECT 语 ...

  2. mysql执行计划命令_【MySQL】EXPLAIN命令详解--解释执行计划

    具体参考: 原文如下: 在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索 ...

  3. MySQL中EXPLAIN命令详解

    EXPLAIN显示了MySQL如何使用索引来处理SELECT语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上EXPLAIN就可以了: 如: EXPLA ...

  4. MySQL 数据库 source 命令详解及实例

    MySQL 数据库 source 命令详解及实例 MySQL 数据库 source 命令,该命令是数据库导入命令.source 命令的用法非常简单,首先你需要进入 MySQL 数据库的命令行管理界面, ...

  5. 【MySQL】explain 用法详解

    [MySQL]explain 用法详解   explain命令主要来查看SQL语句的执行计划,查看该SQL语句有没有使用索引,有没有做全表扫描等.它可以模拟优化器执行SQL查询语句,从而知道MySQL ...

  6. 转:mysql show processlist命令 详解

    转:mysql show processlist命令 详解 processlist 命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令. 1.        进 ...

  7. MySQL操作mysqldump命令详解

    MySQL操作mysqldump命令详解 基本命令: # 数据库备份-->mysqldump命令默认做锁表操作 mysqldump -uroot -ppassword --all-databas ...

  8. mysql dump gtid_mysqldump命令详解 Part 3- 备份全库

    前面说了MySQL Linux平台和Windows平台的安装 下面开始是MySQL的一些学习笔记 前面我们说了如果构造数据 这节开始说MySQL 的备份 环境为MySQL 5.7.25 在解释命令之前 ...

  9. EXPLAIN 命令详解

    转自:https://www.cnblogs.com/gomysql/p/3720123.html 在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个S ...

最新文章

  1. 微信开放JS-SDK,助力网页开发[转自微信官方]
  2. linux time 统计命令执行的时间
  3. QT设置控件背景为透明
  4. AliOS Things 硬件抽象层(HAL)对接系列2 — SPI driver porting
  5. Java面试题之有没有有顺序的Map实现类,如果有,他们是怎么实现有序的?
  6. 【转】syslog服务和syslogd守护进程
  7. 漫步线性代数二十五——特征值和特征向量
  8. SSH整合之四(页面逻辑的实现)
  9. 聚集索引与非聚集索引及其查询效率【转载】
  10. php丢色子,jQuery+PHP实现的掷色子抽奖游戏实例_PHP
  11. 苹果键盘大小写键灯不亮
  12. 多台路由器堆叠_h3c路由器堆叠配置命令
  13. 停课集训 11.27
  14. 业务与信令-第5章VoLTE原理
  15. JavaScript实现效果——考试倒计时
  16. matlab中用polyfit、regress、nlinfit等进行详细的回归分析
  17. 云计算机渲染效果,什么是云渲染?云渲染这么用?
  18. 正宇丨揭秘你不知道的网络水军产业链运作内幕
  19. 密码打马赛克已经不安全了!这款开源的去 “马赛克” 工具一秒还原
  20. 七种功能强大的聊天机器人平台

热门文章

  1. [SpringSecurity]web权限方案_用户认证_查询数据库完成认证
  2. lua实现继承(lua程序设计21.7 练习21.2题)
  3. python3调用c语言数组,使用Python中的ctypes访问数组
  4. python调试_Python调试坑
  5. python文件图标变成小电脑_手把手教你给Python程序写图形界面,并且打包成exe文件-exe文件...
  6. Java HashMap的实现原理详解
  7. Finding Hotels(牛客国庆集训派对Day7 )(2016ICPC青岛K)(K-D Tree)
  8. ICPC 南昌现场赛 K:Tree(dsu on tree + 动态开点线段树)
  9. MySQL中存在索引但不能索引的经典场景(笔记)
  10. 2020 CSP-S 游记