分析索引的效率:
> EXPLAIN sql;
EXPLAIN 分析的结果的表头如下:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra
具体说明如下:
----------------------------------
id
id列数字越大越先执行;
如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询。
----------------------------------
select_type
查询的序列号
A:simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个
B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个
C:union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
D:dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响
E:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null
F:subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
G:dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
H:derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select
----------------------------------
table
显示的查询表名,如果查询使用了别名,那么这里显示的是别名;
如果不涉及对数据表的操作,那么这显示为null,
如果显示为尖括号括起来的<derived N>就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生。
如果是尖括号括起来的<union M,N>,与<derived N>类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集。
----------------------------------
partitions
----------------------------------
type
查询所使用的类型
依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL,
除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引
A:system:
表中只有一行数据或者是空表,且只能用于myisam和memory表。
如果是Innodb引擎表,type列在这个情况通常都是all或者index
B:const:
使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。
其他数据库也叫做唯一索引扫描
C:eq_ref:
出现在要连接过个表的查询计划中,驱动表只返回一行数据,
且这行数据是第二个表的主键或者唯一索引,且必须为not null;
唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref
D:ref:
不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求、只要使用相等条件检索时就可能出现;
常见与辅助索引的等值查找。或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现;
返回数据不唯一的等值查找就可能出现。
E:fulltext:
全文索引检索,要注意,全文索引的优先级很高;
若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引
F:ref_or_null:
与ref方法类似,只是增加了null值的比较。实际用的不多。
G:unique_subquery:
用于where中的in形式子查询,子查询返回不重复值唯一值
H:index_subquery:
用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值;
可以使用索引将子查询去重。
I:range:
索引范围扫描;
常见于使用>,<,is null,between ,in ,like等运算符的查询中。
J:index_merge:
表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引;
官方排序这个在ref_or_null之后,但是实际上由于要读取所个索引,性能可能大部分时间都不如range
K:index:
索引全表扫描,把索引从头到尾扫一遍;
常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
L:all:
这个就是全表扫描数据文件;
然后再在server层进行过滤返回符合要求的记录。
----------------------------------
possible_keys
查询可能使用到的索引都会在这里列出来;
指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。
这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。
----------------------------------
key
查询真正使用到的索引,select_type为index_merge时,这里可能出现两个以上的索引,其他的selec
----------------------------------
key_len
用于处理查询的索引长度;越短越好、速度越快;
如果是单列索引,那就整个索引长度算进去;
如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的列,这里不会计算进去;
留意下这个列的值,算一下你的多列索引总长度就知道有没有使用到所有的列了。
要注意,mysql的ICP特性使用到的索引不会计入其中。
另外,key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。
----------------------------------
ref
如果是使用的常数等值查询,这里会显示const;
如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段;
如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func;
----------------------------------
rows
这里是执行计划中估算的扫描行数,不是精确值;
----------------------------------
filtered
使用explain extended时会出现这个列;
5.7之后的版本默认就有这个字段,不需要使用explain extended了。
这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。
----------------------------------
Extra
这个列可以显示的信息非常多,有几十种,常用的有:
A:distinct:
在select部分使用了distinc关键字
B:no tables used:
不带from字句的查询或者From dual查询
C:using filesort:
排序时无法使用到索引时,就会出现这个。常见于order by和group by语句中
E:using index:
查询时不需要回表查询,直接通过索引就可以获取查询的数据。
F:using join buffer(block nested loop),using join buffer(batched key accss):
5.6.x之后的版本优化关联查询的BNL,BKA特性。主要是减少内表的循环数量以及比较顺序地扫描查询。
G:using sort_union,using_union,using intersect,using sort_intersection:
using intersect:表示使用and的各个索引的条件时,该信息表示是从处理结果获取交集
using union:表示使用or连接各个使用索引的条件时,该信息表示从处理结果获取并集
using sort_union和using sort_intersection:与前面两个对应的类似,只是他们是出现在用and和or查询信息量大时,先查询主键,然后进行排序合并后,才能读取记录并返回。
H:using temporary:
表示使用了临时表存储中间结果。临时表可以是内存临时表和磁盘临时表,执行计划中看不出来,需要查看status变量,used_tmp_table,used_tmp_disk_table才能看出来。
I:using where:
表示存储引擎返回的记录并不是所有的都满足查询条件,需要在server层进行过滤。
查询条件中分为限制条件和检查条件,
5.6之前,存储引擎只能根据限制条件扫描数据并返回,然后server层根据检查条件进行过滤再返回真正符合查询的数据。
5.6.x之后支持ICP特性,可以把检查条件也下推到存储引擎层,不符合检查条件和限制条件的数据,直接不读取,这样就大大减少了存储引擎扫描的记录数量。
extra列显示using index condition
J:firstmatch(tb_name):
5.6.x开始引入的优化子查询的新特性之一,常见于where字句含有in()类型的子查询。如果内表的数据量比较大,就可能出现这个
K:loosescan(m..n):
5.6.x之后引入的优化子查询的新特性之一,在in()类型的子查询中,子查询返回的可能有重复记录时,就可能出现这个
除了这些之外,还有很多查询数据字典库,执行计划过程中就发现不可能存在结果的一些提示信息
----------------------------------
- SQL语句性能分析
SQL语句性能分析 explain执行计划 用法: explain select 语句 命令: show database; use mysql explain select * from user; ...
- mysql 开发进阶篇系列 2 SQL优化(explain分析)
接着上一篇sql优化来说 1. 定位执行效率较低的sql 语句 通过两种方式可以定位出效率较低的sql 语句. (1) 通过上篇讲的慢日志定位,在mysqld里写一个包含所有执行时间超过 long_q ...
- 看懂SqlServer查询计划 SQL语句优化分析
转自 http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html 阅读目录 开始 SQL Server 查找记录的方法 SQL Ser ...
- MySQL innodb中各种SQL语句加锁分析
概要 Locking read( SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),UPDATE以及DELETE语句通常会在他扫描的索引所 ...
- SQL语句优化分析
分析比较执行时间计划读取情况 select * from dbo.Product 执行上面语句一般情况下只给你返回结果和执行行数,那么你怎么分析呢,怎么知道优化之后跟没有优化的区别呢. 下面几种方法: ...
- SQL语句加锁分析
背景 MySQL中SQL加锁的情况十分复杂,不同隔离级别.不同索引类型.索引是否命中的SQL加锁各不相同. 然而在分析死锁过程当中,熟知各种情况的SQL加锁是分析死锁的关键,因此需要将MySQL的各种 ...
- SQL语句性能分析常用命令
DBCC freeproccache DBCC dropcleanbuffers 1.set statistics IO {ON| OFF} /*Transact-SQL 语句生成的磁盘活动量的信息* ...
- 历史执行Sql语句性能分析 CPU资源占用时间分析
SELECT HIGHEST_CPU_QUERIES.PLAN_HANDLE, HIGHEST_CPU_QUERIES.TOTAL_WORKER_TIME, Q.DBID, ...
- sql server profiler 工具使用 sql 语句性能分析
https://www.cnblogs.com/knowledgesea/p/3683505.html
随机推荐
- 斜率优化dp的总结
放在了我的另一个博客上面 斜率优化dp的总结(多刷新几次才打得开)
- Ansible 小手册系列 十四(条件判断和循环)
条件判断 When 语句 在when 后面使用Jinja2 表达式,结果为True则执行任务. tasks: - name: "shut down Debian flavored syste ...
- Python 同一文件中,有unittest不执行“if __name__ == '__main__”,不生成HTMLTestRunner测试报告的解决方案
1.问题:Python中同一个.py文件中同时用unittest框架和HtmlReport框架后,HtmlReport不被执行. 2.为什么?其实不是HtmlReport不被执行,也不是HtmlRep ...
- js中的setTimeout第三个参数
setTimeout跟setInterval大家应该都很熟悉的,但是一直很少注意,原来这两个函数可以支持第三个参数的,但是IE就呵呵了,仅IE(6-9)呵呵了,其他浏览器都支持的。 第三个参数将作为回 ...
- 点击事件target
1.场景:需要写一个弹出框来容纳登录界面,类似于百度的登录框 问题:使用 display: none/block 进行弹出框的显示和隐藏,设立点击事件 onclick 进行触发,但是点击 ...
- java截取字符串,第4位以后的字符串用*代替
public class F { public static void main(String[] args) { /**截取字符串,第4位以后的字符串用*代替*/ String s = " ...
- nodejs 安装失败 ,出现error 2502 和error2503
出现error 2502 和error2503是因为win8的权限问题所导致的,具体说就是要以管理员身份进行安装就可以解决,下面详细来说一下. 1.cmd命令行点击以管理员身份运行. 2.这时候就可以 ...
- cocoa pods自己的笔记
备注:这里只是个人的观点,有的地方也是copy,多多指教,个人笔记,有侵犯你们版权的地方还望海涵!!! 卡主不动 安装流程:http://www.tuicool.com/articles/qaMfuy ...
- java中的线程问题(二)——线程的创建和用法。
在java中一个类要当作线程来使用有两种方法. 1.继承Thread类,并重写run函数 2.实现Runnable接口,并重写run函数 因为java是单继承的,在某些情况下一个类可能已经继承了某个父 ...
- `ifdef、`else、`endif 用法
一般情况下,Verilog HDL源程序中所有的行都参加编译.但是有时候希望对其中的一部份内容只有在条件满足的时候才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足条件 ...