Mysql优化-Explain

Mysql 执行计划

在企业的应用场景中,为了知道优化SQL语句的执行,需要查看SQL语句的具体执行过程,以加快SQL语句的执行效率。

   可以使用explain+SQL语句来模拟优化器执行SQL查询语句,从而知道mysql是如何处理sql语句的。

   官网地址: https://dev.mysql.com/doc/refman/5.5/en/explain-output.html 

执行计划中包含的信息

Column Meaning
id The SELECT identifier
select_type The SELECT type
table The table for the output row
partitions The matching partitions
type The join type
possible_keys The possible indexes to choose
key The index actually chosen
key_len The length of the chosen key
ref The columns compared to the index
rows Estimate of rows to be examined
filtered Percentage of rows filtered by table condition
extra Additional information
  • id
    select查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序
    1.如果id相同,从上到下执行
    2.如果id不同,是子查询,id会递增,id越大优先级越高
    3.id相同和不同的,相同的是一组,一组中从上往下执行,id越大优先级越高
  • select_type
    1.sample:简单的查询,不包含子查询和union
    explain select * from emp;
    2.primary:查询中包含任何负责的子查询,最外层就被标记为primary
    explain select staname,ename supname from (select ename staname,mgr from emp) t join emp on t.mgr=emp.empno ;
    3.union:第二个select出现在union之后标记为union
    explain select * from emp where deptno = 10 union select * from emp where sal >2000;
    4.dependent union:和union类似,dependent 表示 union 或 unionAll 的联合结果受外部影响
    explain select * from emp e where e.empno in ( select empno from emp where deptno = 10 union select empno from emp where sal >2000);
    5.union result:从union获取结果的result
    explain select * from emp where deptno = 10 union select * from emp where sal >2000;
    6.subquery:在select或where 中包含子查询
    explain select * from emp where sal > (select avg(sal) from emp) ;
    7.dependent subquery:subquery 的子查询受到外部条件的影响
    explain select * from emp e where e.deptno in (select distinct deptno from dept);
    8.derived:from后出现子查询中,也叫派生类
    explain select staname,ename supname from (select ename staname,mgr from emp) t join emp on t.mgr=emp.empno ;
    9.uncacheable subquery:表示使用子查询的结果不能被缓存
    explain select * from emp where empno = (select empno from emp where deptno=@@sort_buffer_size);
    10.unchchaable union:union 的结果不能被缓存
    目前没有sql验证
  • table
    对应行正在访问哪一个表,表名或者别名,可能是临时表或者union合并结果集
  • type
    type显示的是访问类型,访问类型表示我是以哪种方式访问我们的数据,最直接是All,扫描全表,效率最低。访问类型有很多,效率从最好到最坏依次是:
    system -> const -> eq_ref -> ref -> fulltext -> ref_or_null -> index_merge -> unique_subquery -> index_subquery -> range ->index -> All
    一般情况下,要保证查询达到range级别,最好达到ref级别。
    1.All
    全表扫描,出现这个,数据量比较大的情况下,需要优化
    explain select * from emp;
    2.index
    全索引扫描,效率比All好。两种情况:1.使用了覆盖索引。2.使用了索引排序
    explain select empno from emp;
    3.range
    表示利用索引查询限制了范围,在指定范围内查询
    explain select * from emp where empno between 7000 and 7500;
    4.index_subquery
    利用索引来关联子查询,不再扫描全表
    explain select * from emp where emp.job in (select job from t_job);
    5.unique_subquery
    和index_subquery类似,使用的是唯一索引
    explain select * from emp e where e.deptno in (select distinct deptno from dept);
    6.index_merge
    查询中使用多个索引组合使用
    7.ref_or_null
    对某个索引需要关联查询,也需要null值的条件
    explain select * from emp e where e.mgr is null or e.mgr=7369;
    8.ref
    使用了非唯一性索引进行数据查找
    create index idx_3 on emp(deptno);
    explain select * from emp e,dept d where e.deptno =d.deptno;
    9.eq_ref
    使用了唯一性索引进行数据查找
    explain select * from emp,emp2 where emp.empno = emp2.empno;
    10.const
    表里至多有一行匹配
    11.system
    表只有一行记录,等于系统表
  • possible_keys
    显示可能应用在这张表中的索引,一个或多个,查询的字段如果涉及到索引,都会被列出,但不一定被使用
  • key
    实际使用到的索引,如果为null,则没有使用索引,查询中如果使用了覆盖索引,该字段和查询的select字段重叠
  • key_len
    索引中使用的字节数长度,不损失精度的情况下,长度越短越好
  • ref
    显示索引的哪一列被使用到。
  • rows
    根据表的统计信息和使用情况,估算出索引扫描的行数,此参数很重要,反应了sql扫描了多少行,越少越好
  • extra
    额外信息
--using filesort:说明mysql无法利用索引进行排序,只能利用排序算法进行排序,会消耗额外的位置
explain select * from emp order by sal;

--using temporary:建立临时表来保存中间结果,查询完成之后把临时表删除
explain select ename,count(*) from emp where deptno = 10 group by ename;

--using index:这个表示当前的查询时覆盖索引的,直接从索引中读取数据,而不用访问数据表。如果同时出现using where 表名索引被用来执行索引键值的查找,如果没有,表面索引被用来读取数据,而不是真的查找
explain select deptno,count(*) from emp group by deptno limit 10;

--using where:使用where进行条件过滤
explain select * from t_user where id = 1;

--using join buffer:使用连接缓存,情况没有模拟出来

--impossible where:where语句的结果总是false
explain select * from emp where empno = 7469;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容