再 SQL 优化中,我们经常需要去找那些查询比较耗时的语句,找到以后我们还要对其进行优化,些时我们常常用到 explain 这个命令来查看一个这些 SQL 语句的执行情况,查看该 SQL 语句有没有使用上了索引,有没有做全表扫描,这都可以通过 explain 命令来查看。所以我们深入了解 MySQL 的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行 SQL 语句时哪种策略预计会被优化器采用。

使用方法

在 select 语句前加上 explain 就可以了,如

各个属性的含义

id

select 查询的序列号;

select_type

select 查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询;

table

输出的行所引用的表;

type

联合查询所使用的类型,type 显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge

> unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到 ref

possible_keys

指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验 WHERE 子句,看是否引用某些字段,或者检查字段不是适合索引;

key

显示MySQL实际决定使用的键。如果没有索引被选择,键是 NULL;

key_len

显示MySQL决定使用的键长度。如果键是 NULL,长度就是 NULL。文档提示特别注意这个值可以得出一个多重主键里 mysql 实际使用了哪一部分;

ref

显示哪个字段或常数与 key 一起被使用;

rows

这个数表示 mysql 要遍历多少数据才能找到,在 innodb 上是不准确的;

Extra

如果是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。

如果是where used,就是使用上了where限制。

如果是impossible where 表示用不着where,一般就是没查出来啥。

如果此信息显示 Using filesort 或者 Using temporary 的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照 WHERE 来确定索引,那么在 ORDER BY 时,就必然会引起 Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。

常见的名词解释

Using filesort

MySQL需要额外的一次传递,以找出如何按排序顺序检索行。

Using index

从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。

Using temporary

为了解决查询,MySQL 需要创建一个临时表来容纳结果。

ref

对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取

ALL

完全没有索引的情况,性能非常地差劲。

index

与 ALL 相同,除了只有索引树被扫描。这通常比 ALL 快,因为索引文件通常比数据文件小。

SIMPLE

简单 SELECT,不使用 UNION 或子查询

explain 手册查询

id

SELECT 识别符。这是SELECT的查询序列号

select_type

SELECT 类型,可以为以下任何一种:

SIMPLE:简单SELECT(不使用UNION或子查询)

PRIMARY:最外面的SELECT

UNION:UNION中的第二个或后面的SELECT语句

DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询

UNION RESULT:UNION 的结果

SUBQUERY:子查询中的第一个SELECT

DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询

DERIVED:导出表的SELECT(FROM子句的子查询)

table

输出的行所引用的表

type

联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:

system:表仅有一行(=系统表)。这是const联接类型的一个特例。

const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!

eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。

ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。

ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。

index_merge:该联接类型表示使用了索引合并优化方法。

unique_subquery:该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。

index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)

range:只检索给定范围的行,使用一个索引来选择行。

index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。

ALL:对于每个来自于先前的表的行组合,进行完整的表扫描。

possible_keys

指出MySQL能使用哪个索引在该表中找到行

key 显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。

key_len 显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。

ref 显示使用哪个列或常数与key一起从表中选择行。

rows 显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。

filtered 显示了通过条件过滤出的行数的百分比估计值。

Extra

该列包含 MySQL 解决查询的详细信息

Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。

Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。

range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。

Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。

Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。

Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。

Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。

Using sort_union(…), Using union(…), Using intersect(…):这些函数说明如何为index_merge联接类型合并索引扫描。

Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。

explain mysql语句_使用 explain 查看 MySQL 中 SQL 语句的执行情况 - 文章相关推荐

  1. mysql查看cpu使用高sql语句_查询CPU占用高的SQL语句

    触发器造成死锁.作业多且频繁.中间表的大量使用.游标的大量使用.索引的设计不合理.事务操作频繁.SQL语句设计不合理,都会造成查询效率低下.影响服务器性能的发挥.我们可以使用sql server自带的 ...

  2. navicat mysql 日志_使用Navicat查看MySQL日志的具体方法

    使用Navicat查看MySQL日志的具体方法 发布时间:2020-05-18 14:04:52 来源:51CTO 阅读:699 作者:三月 下文主要给大家带来使用Navicat查看MySQL日志的具 ...

  3. mysql navicat 多语句_使用Navicat多对多关系SQL语句在MySQL中实现

    /** *功能:模拟两张表关系及添加两个主键和外键详细过程 *日期: 2018年7月26日   18:45 *注释: 学习数据库MySQL的点点记录, 谢谢网上各位大神分享经验与资料, 欢迎各位大神批 ...

  4. sql删除语句_推荐强大开源的数据库SQL语句审核平台,再也不用担心删除跑路了!...

    删除数据库跑路,本来是一个调侃的话语,但是前段时间在互联网圈子真的发生过,震动整个圈子,为了避免此类悲剧再次发生,现推荐一个强大的开源SQL语句管理平台,具体的功能如下: 用户模块 1.Dashboa ...

  5. tp5循环查询语句_如何用Excel快速生成SQL语句,用过的人都说好

    Excel的公式自动生成想必大家都知道了,就是写好一个公式后直接往下拖,就可以将后面数据的公式自动生成. 今天我们就用这个功能来快速生成SQL语句. 导入Excel数据 Excel的数据有多种方式,这 ...

  6. oracle 带有变量的语句_【成都校区】Oracle SQL语句之常见优化方法总结

    本帖出自于黑马程序员成都中心,更多资源可关注微信公众号 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行. 2.使用表的别名: 当在SQL语句中连接多 ...

  7. oracle 查看用户日志,Oracle查看用户操作sql语句以及数据库日志

    --查看日志文件 select member from v$logfile; --查看表空间使用情况 SELECT SUM(bytes) / (1024 * 1024) AS free_space, ...

  8. mysql数据库语句分类_细数MySQL中SQL语句的分类

    1:数据定义语言(DDL) 用于创建.修改.和删除数据库内的数据结构,如:1:创建和删除数据库(CREATE DATABASE || DROP  DATABASE):2:创建.修改.重命名.删除表(C ...

  9. Mysql中SQL语句不使用索引的情况

    Mysql中SQL语句不使用索引的情况 MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多时候,即使增加了索引,查询仍然不使用索引,这种情况严重影响性能,这里就简单总结 ...

  10. MySql安装教程与HeidiSQL管理工具使用方法、HeidiSQL中SQL语句使用(六)

    文章目录 Mysql下载路径 Mysql管理工具--HeidiSQL下载 安装完成之后可以进行sql语句测试编辑 设置主键自增长 HeidiSQL中SQL语句使用 创建数据库 删除与创建表 像表中插入 ...

最新文章

  1. ueditor1.4.3jsp版成功上传图片后却回显不出来与在线管理显示不出图片的解决方案...
  2. 如何在Eclipse中自动删除尾随空格?
  3. Spring的datasource配置详解
  4. powershell提取html字段,Windows PowerShell:PowerShell 中的 HTML 报告
  5. 装饰者设计模式,简单代码实现
  6. 推荐一款UI设计软件Balsamiq Mockups
  7. 在理解通用近似定理之前,你可能都不会理解神经网络
  8. 统计学第一章--最小二乘拟合正弦函数,正则化
  9. phpcms authkey生成算法问题导致authkey泄露
  10. 如何使用CCRenderTexture创建动态纹理 Cocos2d-x 2 1 4
  11. 《实现模式(修订版)》—第2章模式
  12. 使用ReactiveCocoa实现iOS平台响应式编程
  13. 读书篇:《细说PHP》二、PHP的基本语法、变量、常量、以及运算符
  14. 计算二叉树叶子结点数目
  15. navicat 创建模型
  16. 很多人生哲理好句子分享
  17. 程序员日常工作总结2020-01-21
  18. 团建游戏----啦啦队
  19. 谷歌浏览器自带的翻译功能无法使用的解决办法
  20. (转)Visual SourceSafe (VSS的使用方法)使用方法

热门文章

  1. 提取多个文件夹图片到一个文件夹
  2. 字符串的常见方法总结
  3. 分析 BAT 互联网巨头在大数据方向布局及大数据未来发展趋势
  4. postgres mysql quora_DesktopReader for Quora
  5. 使用Bookinfo应用测试Kuma服务网格
  6. android 电视 vob格式转换,旭日Android视频格式转换器
  7. Android CoordinatorLayout自定义Behavior实现依赖滚动布局
  8. 模拟人生4中文免费版 电脑版
  9. 免费企业邮箱: Google企业邮箱的申请
  10. 小包实用工具:国家代码大全