如何查看MySQL执行计划
在介绍怎么查看MySQL执行计划前,我们先来看个后面会提到的名词解释:
覆盖索引: MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件 包含所有满足查询需要的数据的索引称为 覆盖索引(Covering Index) 如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降
EXPLAIN查看执行计划的一些局限:
1.EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
2.EXPLAIN不考虑各种Cache
3.EXPLAIN不能显示MySQL在执行查询时所作的优化工作,部分统计信息是估算的,并非精确值
4.EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: ref
possible_keys: idx_customer_no
key: idx_customer_no
key_len: 99
ref: const
rows: 1
Extra: Using index condition; Using where 1 row in set (0.00 sec)
id:是一组数字,表示查询中执行select子句或操作表的顺序。如果是子查询,id的序列号会递增。
id越大则优先级越高,越先会被执行。id如果相同,则可以认为是一组,从上往下顺序执行。
select_type:取值有simple,primary,subquery,derived,union,unionresult
simple:表示查询中不包含子查询或者union
primary:当查询中包含任何复杂的子部分,最外层的查询被标记成primary
subquery:在select或where列表中包含了子查询,则子查询被标记成subquery
derived:在from的列表中包含的子查询被标记成derived
union:若第二个select出现在union后,则被标记成union,若union在from子句的子查询中,外层的select被标记成derived
unionresult:从union表获取结果的select被标记成union result
table:显示这一行的数据是关于哪张表的
type:访问类型,表示在表中找到所需行的方式,常见的类型有all,index,range,ref,eq_ref,const,system,null性能从左至右由差至好。
ALL:即full table scan,mysql将遍历全表来找到所需要的行
index:full index scan,只遍历索引树
range:表示索引范围扫描,对索引的扫描开始于一点,返回匹配值域的行,常见于between,<,>的查询
ref:为非唯一性索引扫描,返回匹配某个单独值的所有行,常见于非唯一索引即唯一索引的非唯一前缀进行的查找。
eq_ref:表示唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或者唯一索引扫描。
const,system表示当对查询部分进行优化,并转化成一个常量时,使用这些类型访问。比如将主键置于where列表中,mysql就能把该查询置成一个常量。system是const的一个特例,当查询表中只有一行的情况下使用的是system。 null表示在执行语句中,不用查表或索引。
possiblekey:表示能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引被列出,但不一定被查询使用。
key:表示查询时使用的索引。若查询中使用了覆盖索引,则该索引仅出现在key中。
key_len:表示索引所使用的字节数,可以通过该列结算查询中使用的索引长度
ref:表示上述表的链接匹配条件,即哪些列或常量可被用于查找索引列上的值。
rows:表示根据mysql表统计信息及索引选用情况,估算找到所需记录要读取的行数。
extra:表示不在其他列并且也很重要的额外信息。
using index表示相应的select中使用了覆盖索引。
usingwhere表示存储引擎搜到记录后进行了后过滤(POST-FILTER),如果查询未能使用索引,usingwhere的作用只是提示我们mysql要用where条件过滤Z结果集。
using temporay表示临时表来存储结果集,常见于排序和分组查询。
using filesort mysql中无法用索引完成的排序成为文件排序
extra值参考列表
distinct: 当mysql找到第一条匹配的结果值时,就停止该值的查询,然后继续该列其他值的查询。
not exists: 在左连接中,优化器可以通过改变原有的查询组合而使用的优化方法。当发现一个匹配的行之后,不再为前面的行继续检索,可以部分减少数据访问的次数。例如,表t1、t2,其中t2.id为not null,对于SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;由于 t2.id非空,所以只可能是t1中有,而t2中没有,所以其结果相当于求差。left join原本是要两边join,现在Mysql优化只需要依照 t1.id在t2中找到一次t2.id即可跳出。
const row not found: 涉及到的表为空表,里面没有数据。
Full scan on NULL key: 是优化器对子查询的一种优化方式,无法通过索引访问NULL值的时候会做此优化。
Impossible Having: Having子句总是false而不能选择任何列。例如having 1=0
Impossible WHERE: Where子句总是false而不能选择任何列。例如where 1=0
Impossible WHERE noticed after reading const tables: mysql通过读取“const/system tables”,发现Where子句为false。也就是说:在where子句中false条件对应的表应该是const/system tables。这个并不是mysql通过统计信息做出的,而是真的去实际访问一遍数据后才得出的结论。当对某个表指定了主键或者非空唯一索引上的等值条件,一个query最多只可能命中一个结果,mysql在explain之前会优先根据这一条件查找对应记录,并用记录的实际值替换query中所有用到来自该表属性的地方。例如:select * from a,b where a.id = 1 and b.name = a.name 执行过程如下:先根据a.id = 1找到一条记录(1, 'name1'),然后将b.name换成'name1',然后通过a.name = 'name1'查找,发现没有命中记录,最终返回“Impossible WHERE noticed after reading const tables”。
No matching min/max row: 没有行满足如下的查询条件。例如:EXPLAIN SELECT MIN(actor_id) FROM actor WHERE actor_id > 3(只有两条记录)actor_id为唯一性索引时,会显示“No matching min/max row”,否则会显示“using where”。
no matching row in const table: 对一个有join的查询,包含一个空表或者没有数据满足一个唯一索引条件。
No tables used: 查询没有From子句,或者有一个From Dual(dual:虚拟表,是为了满足select...from...习惯)子句。例如:EXPLAIN SELECT VERSION()
Range checked for each record (index map: N): Mysql发现没有好的index,但发现如果进一步获取下一张join表的列的值后,某些index可以通过range等使用。Mysql没找到合适的可用的索引。取代的办法是,对于前一个表的每一个行连接,它会做一个检验以决定该使用哪个索引(如果有的话),并且使用这个索引来从表里取得记录。这个过程不会很快,但总比没有任何索引时做表连接来得快。
Select tables optimized away: 当我们使用某些聚合函数来访问存在索引的某个字段时,优化器会通过索引直接一次定位到所需要的数据行完成整个查询。在使用某些聚合函数如min,max的query,直接访问存储结构(B树或者B+树)的最左侧叶子节点或者最右侧叶子节点即可,这些可以通过index解决。Select count(*) from table(不包含where等子句),MyISAM保存了记录的总数,可以直接返回结果,而Innodb需要全表扫描。Query中不能有group by操作。
unique row not found: 对于SELECT … FROM tbl_name,没有行满足unique index或者primary key。从表中查询id不存在的一个值会显示Impossible WHERE noticed after reading const tables。
Using filesort: 指Mysql将用外部排序而不是按照index顺序排列结果。数据较少时从内存排序,否则从磁盘排序。Explain不会显示的告诉客户端用哪种排序。
Using index: 表示Mysql使用覆盖索引避免全表扫描,不需要再到表中进行二次查找数据。注意不要和type中的index类型混淆。
Using index for group-by: 类似Using index,所需数据只需要读取索引,当query中有group by或distinct子句时,如果分组字段也在索引中,extra就会显示该值。
Using temporary: Mysql将创建一个临时表来容纳中间结果。在group by和order by的时,如果有必要的话。例如group by一个非键列,优化器会创建一个临时表,有个按照group by条件构建的unique key,然后对于每条查询结果(忽略group by),尝试insert到临时表中,如果由于unique key导致insert失败,则已有的记录就相应的updated。例如,name上没有索引,SELECT name,COUNT(*) FROM product GROUP BY name,为了排序,Mysql就需要创建临时表。此时一般还会显示using filesort。
Using where: 表示Mysql将对storage engine提取的结果进行过滤。例如,price没有index,SELECT * FROM product WHERE price=1300.00。有许多where的条件由于包含了index中的列,在查找的时候就可以过滤,所以不是所有带where子句的查询会显示Using where。 Using join buffer:5.1.18版本以后才有的值。join的返回列可以从buffer中获取,与当前表join。例如:explain select * from t1,t2 where t1.col < 10 and t2.col < 10
Scanned N databases: 指在处理information_schema查询时,有多少目录需要扫描。例如:EXPLAIN SELECT TABLE_NAME, ROW_FORMAT FROM INFORMATION_SCHEMA.TABLES网上说这个查询会显示Scanned all databases,我试了下extra列是空。 Skip_open_table, Open_frm_only, Open_trigger_only, Open_full_table:指示从information_schema查询信息时有关文件开启的优化。 Skip_open_table:表信息已经获得,不需要打开。 Open_frm_only:只打开.frm文件。 Open_trigger_only:只打开.trg文件。 Open_full_table:没有优化。.frm,.myd和.myi文件都打开。
Using sort_union(…), Using union(…), Using intersect(…): 都出现在index_merge读取类型中。 Using sort_union:用两个或者两个以上的key提取数据,但优化器无法确保每个key会提取到一个自然排好序的结果,所以为了排除多余的数据,需要额外的处理。例如,customer的state,(lname,fname)是key,但lname不是key,SELECT COUNT(*) FROM customer WHERE (lname = ‘Jones') OR (state = ‘UT'),由于lname上面没有key,所以使用(lname,fname),使得结果可能不按照顺序,优化器需要额外的一些工作。 Using union:用两个或者两个以上的key提取数据,分别取得结果是已排序,通过合并就可以获得正确结果。例如,customer中的state和(lname,fname)是key,SELECT COUNT(state) FROM customer WHERE (lname = ‘Jones' AND fname='John') OR (state = ‘UT')。 Using intersect:用两个或者两个以上的key提取数据,分别取得结果是已排序,通过求交就可以获得正确结果。例如,customer中的state和(lname,fname)是key,SELECT COUNT(state) FROM customer WHERE (lname = ‘Jones' AND fname='John') AND (state = ‘UT')。
Using where with pushed condition: 仅用在ndb上。Mysql Cluster用Condition Pushdown优化改善非索引字段和常量之间的直接比较。condition被pushed down到cluster的数据节点,并在所有数据节点同时估算,把不合条件的列剔除避免网络传输。
如何查看MySQL执行计划的更多相关文章
- 查看Mysql执行计划
使用navicat查看mysql执行计划: 打开profile分析工具: 查看是否生效:show variable like ‘%profil%’; 查看进程:show processlist; 选择 ...
- 如何查看MySQL执行计划呢?
覆盖索引: MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件 包含所有满足查询需要的数据的索引称为 覆盖索引(Covering Index) 如果要使用覆盖索引,一定 ...
- explain命令---查看mysql执行计划
引言: 实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表.怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是瞬间的,因 ...
- mysql执行计划
烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长.如何写好sql,学会看执行计划至关重要.下面我简单讲讲mysql的执行计划,只列出了一些常见的情况, ...
- mysql执行计划介绍
简单讲讲mysql的执行计划,只列出了一些常见的情况,希望对大家有所帮助 烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长.如何写好sql,学会看执行计划至 ...
- MySQL执行计划解读
Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得 ...
- mysql 执行计划的理解
1.执行计划就是在sql语句之前加上explain,使用desc 也可以.2.desc有两个选项extended和partitions,desc extended 将原sql语句进行优化,通过show ...
- MySQL执行计划 EXPLAIN参数
MySQL执行计划参数详解 转http://www.jianshu.com/p/7134286b3a09 MySQL数据库中,在SELECT查询语句前边加上“EXPLAIN”或者“DESC”关键字,即 ...
- MySQL 执行计划explain详解
MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但 ...
随机推荐
- NBU AIX ORACLE10G RAC恢复到AIX单实例(表空间恢复)
ln -s /usr/openv/netbackup/bin/libobk.a64 /oraclev3/product/10.2.0/lib/libobk.a不建软连接会报如下错误: using ta ...
- 课堂scrum站立会议
项目名称:连连看游戏 小组名称:四大天王 开会时间 :2016年10月11日 20:20~20:40 master:张政 成员:张政,张金生,武志远,李权 站立会议内容 1.已完成的工作 window ...
- 静态修饰符(关键字static)
1.Static修饰的方法或变量通常称为类方法和类属性 2.静态方法中不能使用this和super关键字,也不能做为局部变量使用 3.在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成 ...
- /etc/resolv.conf overwritten. Redhat/Centos
Prevent /etc/resolv.conf from being blown away by RHEL/CentOS after customizing If you are using RHE ...
- 性能测试框架Locust初学笔记
Locust初探 Locust是一款类似于Jmeter开源负载测试工具,所不同的是它是用python实现,并支持python脚本. locust提供web ui界面,能够方便用户实时监控脚本运行状态. ...
- 1,SFDC 管理员篇 - 基本设置
1, 公司配置 Setup | Administrator| Company Profile *Company Inforamtion:公司基础信息,License信息,重要的设置包括本地时间,币种, ...
- js事件委托,可以使新添加的元素具有事件(event运用)
miaov视频教程 http://study.163.com/course/courseMain.htm?courseId=231002 <!DOCTYPE html PUBLIC " ...
- canvas画随机闪烁的星星
canvas画一颗星星: 规则的星星有内切圆和外切圆,每两个点之间的角度是固定的,因此可得到星星的每个点的坐标,画出星星. function drawStars(x,y,radius1,radius2 ...
- mgo中DBRef-数据添加测试
2014-1-25 在设计mongo数据库时遇到这样一个问题,日志信息表需要引用人员信息表的数据.如果是结构化数据库,基本上不用想太多的东西.由于刚接触非结构化数据库,按着书上的理解由于日志数量较多, ...
- python(第五步django)
这是一个关于,web开发的库, 下一步需要重点掌握的是,网页跳转和数据展示,和面向对象的关系的重用的内容 1:目前掌握的是project 的创建,和app的创建, 2: