MySQL分析工具explain介绍
EXPLAIN是MySQl必不可少的一个分析工具,主要用来测试sql语句的性能及对sql语句的优化,或者说模拟优化器执行SQL语句。
简单的说是execute plan, 获取MySQL数据库的执行计划。本文重点介绍explain的使用和各参数的意义。
首先看一个例子,现有一张表格filesinfo,主键FileId,建立索引 create index DevInfoIndex on FilesInfo (CamID, SliceStartTime, SliceStopTime); 表格除DevInfoIndex 显示的字段外还有其他几个字段。目前表格有110左右条数据。
然后我们执行下面语句:
(1)
该SQL语句,对主键FileId进行排序,且只查找开始四条。而rows也是4,因为可以看到key中直接用的主键索引。
(2)我们再执行下一条语句:
和上面比较,我们把排序改成了索引DevInfoIndex 的第一个字段。rows还是4,而key变化了,使用索引DevInfoIndex ,最后Extra显示使用了索引。
(3)接着我们继续执行:
和上一条语句比较,我们只是修改排序的字段,SliceStartTime是索引的第二个字段。而rows变成了53。
从Extra看,虽然查找了索引,但是还用了filesort文件排序,也就是说明联合索引的数据先按第一个字段的顺序进行存储,后面的字段单独需要排序查找时,需要再对文件进行排序。
(4)继续
这次语句的变化主要是查找内容,*表示所有字段;排序字段还是索引的首个字段CamID,可是type变成了ALL,全表扫描;所以Extra显示 filesort。
以上几步操作只是 对 explain工具显示的结果的几个主要参数进行分析和展示。
下面再逐一进行介绍。
id: 查询的序列号;查询中执行 select 子句或操作表的顺序,id 值越大优先级越高,越先被执行。id 相同,执行顺序由上至下。
select_type : 查询的类型,主要包括普通查询、联合查询、子查询。主要取值:
SIMPLE------简单的 select 查询,不使用 union 及子查询.
PRIMARY------最外层的 select 查询
UNION------UNION 中的第二个或随后的 select 查询,不 依赖于外部查询的结果集
DEPENDENT UNION------UNION 中的第二个或随后的 select 查询,依 赖于外部查询的结果集
SUBQUERY------子查询中的第一个 select 查询,不依赖于外 部查询的结果集
DEPENDENT SUBQUERY------子查询中的第一个 select 查询,依赖于外部 查询的结果集
DERIVED------用于 from 子句里有子查询的情况。 MySQL 会 递归执行这些子查询, 把结果放在临时表里
UNCACHEABLE SUBQUERY------结果集不能被缓存的子查询,必须重新为外 层查询的每一行进行评估
UNCACHEABLE UNION------UNION 中的第二个或随后的 select 查询,属 于不可缓存的子查询
table:所访问数据库的表的名称
type:联合查询使用的类型显示的访问类型是重要指标,结果从好到坏:
system------系统表;表仅有一行(=系统表)。这是 const 连接类型的一个特例。
const------读常量;const 用于用常数值比较 PRIMARY KEY 时。当 查询的表仅有一行时,使用 System。
eq_ref ------最多一条匹配结果,通常是通过主键访问;
ref------;连接不能基于关键字选择单个行,可能查找 到多个符合条件的行。 叫做 ref 是因为索引要 跟某个参考值相比较。这个参考值或者是一 个常数,或者是来自一个表里的多表查询的 结果值。
fulltext------全文索引检索;
ref_or_null------;如同 ref, 但是 MySQL 必须在初次查找的结果 里找出 null 条目,然后进行二次查找。
index_merge------合并索引结果集;说明索引合并优化被使用了。
unique_subquery------;在某些 IN 查询中使用此种类型,而不是常规的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery()------子查询返回的是索引,但非主键;在 某 些 IN 查 询 中 使 用 此 种 类 型 , 与 unique_subquery 类似,但是查询的是非唯一 性索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
range------索引范围扫描;只检索给定范围的行,使用一个索引来选择 行。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,
用常量比较关键字列时,可 以使用 range。
index------全索引扫描;全表扫描,只是扫描表的时候按照索引次序 进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。
all------全表扫描;最坏的情况,从头到尾全表扫描。
possible_keys: 指出mysql能使用哪个索引有助于在该表中找到该行,如果这个值为空,则表示没有相关的索引。
key:显示mysql实际决定使用的建,如果没有索引被选择,键是null。
key_len: 显示mysql决定使用索引的长度,在不损失精确性的情况 下,长度越短越好。如果key是空,则长度就是null。
ref:显示哪个字段或常数与key一起使用。如果使用了索引则显示const,否则,显示null。
rows:MYSQL 认为必须检查的用来返回请求数据的行数。
Extra: 出现以下 2 项意味着 MYSQL 根本不能使用索引,效率会受到重大影响。应尽可能对此进行优化。
Using filesort------表示 MySQL 会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在内存或者磁盘上进行排序。
MySQL 中无法利用索引完成的排序操作称为“文件排序”。
Using temporary------表示 MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。
以上对命令explain及其参数的意义基本介绍完成。希望以后对于SQL语句的性能分析,是否需要优化,做到心中有数。
MySQL分析工具explain介绍的更多相关文章
- 日志分析工具-ApexSQL介绍
原文:日志分析工具-ApexSQL介绍 使用场景:业务数据异常变化,通过代码分析不出来的时候,迫不得已需要通过日志来分析 下载地址:http://www.apexsql.com/Download.as ...
- Windows系统内存分析工具的介绍
Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任 ...
- 性能分析工具gprof介绍(转载)
性能分析工具gprof介绍Ver:1.0 目录1. GPROF介绍 42. 使用步骤 43. 使用举例 43.1 测试环境 43.2 测试代码 43.3 数据分析 53.3.1 flat profil ...
- 马哈鱼血缘分析工具部署介绍--win 10
马哈鱼血缘分析工具部署介绍--win 10 随着大数据技术的发展与普及,数据治理和数据质量变得越来越重要,数据血缘分析在业界悄然兴起并得到了广泛流行,马哈鱼是国内少有的一款专业且易用的血缘分析工具.本 ...
- mysql 慢执行分析工具explain/desc
一.如何操作 explain + 增删改查语句; 二. 输出格式 possible_keys mysql在搜索表记录时可能使用哪个索引. key 实际使用的索引,如果没有索引被使用,则为null. ...
- [MySQL]--查询性能分析工具-explain关键字
explain显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. explain的使用方法很简单,只需要在select查询语句前面加上expl ...
- 品味性能之道<五>:SQL分析工具
一.SQL语句到底是怎么执行的? 想了解SQL语句到底是怎么执行的,那就需要进行SQL语句执行计划分析. 那什么是SQL语句执行计划呢? 就是Oracle服务器执行SQL语句的过程.例如确定是否使用索 ...
- C++静态代码分析工具推荐——PVS-Studio
长假归来,最近一直没更新,节前本来就想写这篇了,一直到今天才有时间. 关于静态代码分析在维基百科上可以查到很详细的介绍:https://en.wikipedia.org/wiki/List_of_to ...
- MongoDB分析工具之一:explain()语句分析工具
explain(),语句分析工具 MongoDB 3.0之后,explain的返回与使用方法与之前版本有了很大的变化,介于3.0之后的优秀特色和我们目前所使用给的是3.0.7版本,本文仅针对Mongo ...
随机推荐
- Mabitis
Mybatis 一.框架概念: Java框架,一个软件半成品,简单来说就是一个别人搭好的舞台,你来做表演,说白了Java框架就是封装好方便程序员操作的类,使项目的开发更简单,维护起来也更容易. 而My ...
- 关于Queries_per_sec 性能计数器
[问题描述] Queries_per_sec (QPS)是数据库两个比较重要的性能计数器指标.我们经常要求开发告知这个参数,以评估数据库的一个负载情况.下面的这段代码连上服务器,做一个简单的查询: u ...
- CSS-18-媒体查询
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- apache和nginx那点事儿--阻塞和异步
先明白的事儿:当一个程序在执行的时候,一般会创建一个进程,也可以有多个进程.一个进程至少会创建一个线程,多个线程共享一个程序进程的内存.程序的运行最终是靠线程来完成操作的.线程的数量跟CPU核数有关, ...
- 关于基本布局之——Grid布局
Gird布局 一.关于概念 网格布局(Grid)是一个很强大的 CSS 布局方案.它可以将网页划分为多个网格任意拼接的布局,可以灵活的运用并实现出多种布局形式. (grid和inline-grid区别 ...
- 老哈佛H3的空调控制器的维修记录
这部哈弗车是2005年出厂的,应该差不多是第一批了吧,小毛病很多了.夏天到了,空调也不能启动,灯不亮,按键没反应令我很是着急.于是开始研究. 这款空调的控制器在cd机中控下面,需要拆中控取出.是一个黑 ...
- JDK源码之Byte类分析
一 简介 byte,即字节,由8位的二进制组成.在Java中,byte类型的数据是8位带符号的二进制数,以二进制补码表示的整数 取值范围:默认值为0,最小值为-128(-2^7);最大值是127(2^ ...
- Unreal Engine 4 蓝图完全学习教程(五)—— 关于数组
Ⅰ.数组的含义及使用 数组是能统一保存若干数值的特殊变量.数组可以指定编号.运用其中的值,因此能够有序地管理大量的数据. 首先试图将上次创建的msg变量修改成数组,在细节栏点击修改: 并选择“修改变量 ...
- Pycharm2019.1.1永久破解
声明:不做商业用途,电脑系统win10专业版,亲测有效. 1,下载新版破解补丁+安装包 网盘链接 提取码:hn0u 下载补丁文件 jetbrains-agent.jar 并将它放置到 pycharm安 ...
- 2018icpc南京现场赛-I Magic Potion(最大流)
题意: n个英雄,m个怪兽,第i个英雄可以打第i个集合里的怪兽,一个怪兽可以在多个集合里 有k瓶药水,每个英雄最多喝一次,可以多打一只怪兽,求最多打多少只 n,m,k<=500 思路: 最大流, ...