explain之extra

包含不适合在其他列中显示但十分重要的额外信息

using filesort:文件排序

表明MySQL会对数据使用一个外部的索引排序,
而不是按照表内的索引顺序读取,
mysql无法利用索引完成的排序操作称之为文件排序
常见于order by 排序

mysql> explain select * from tbl_person where age=23 order by address\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tbl_persontype: ref
possible_keys: idx_age_name_addresskey: idx_age_name_addresskey_len: 4ref: constrows: 3Extra: Using where; Using index; Using filesort

排序时出现了useing filesort文件排序,对查询性能影响很大,需要优化
order by 排序尽量使用索引或者按复合索引的顺序使用排序字段
如:复合索引是c1_c2_c3,所以使用where c1='a' order by c2,c3这样就可以解决出现文件排序的问题
where c1='a' and c2='b' order by c3 这样的方式也可以

因为中间缺失了name所以,按age,name address顺序加上name索引即可
explain select * from tbl_person where age=23 order by name, address;
explain select * from tbl_person where age=23 and name='aa' order by address;

using temporary:临时表排序

使用了临时表保存中间结果, MySQL在对查询结果排序时使用临时表。 常见于order by 和group by

mysql> explain select * from tbl_person where age=23 GROUP BY address\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tbl_persontype: ref
possible_keys: idx_age_name_addresskey: idx_age_name_addresskey_len: 4ref: constrows: 3Extra: Using where; Using index; Using temporary; Using filesort

出现using temporary临时表排序,必须优化
group by 一定尽量的按索引的个数顺序来,不然特别容易产生文件内排序临时表的创建很消耗系统性能的

因为中间缺失了name所以,按age,name address顺序加上name索引即可
explain select * from tbl_person where age=23 group by name, address;
explain select * from tbl_person where age=23 and name='aa' group by address;

using index :查询索引文件

表示相应的select操作使用了覆盖索引(covering index), 避免访问了表的数据行,效率不错
如果同时出现useing where,表明索引被用来执行索引键值查找
如果没有同时出现using where,表示索引用来读取数据而非执行查找动作(条件)
这个状态无需优化

mysql> explain select * from tbl_person        where age=23 order by name\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tbl_persontype: ref
possible_keys: idx_age_name_addresskey: idx_age_name_addresskey_len: 4ref: constrows: 3Extra: Using where; Using index

这里使用age和name索引,name用作排序了

其他属性

using where:索引用作查询条件

using join buffer:使用连接缓存,join使用的多了,会出现缓存

inpossible where:where 字句的值总是false,不能获取任何数据
explain select age from tbl_person where name ='aa' and name='bb';

select table optimized away:在没有group by子句的情况下,基于索引优化min/max操作或者对于MyISAM存储引擎优化count(*)操作,不必等到执行阶段再进行计算,查询执行计划生成阶段即完成优化

distinct:优化distinct操作,在找到第一匹配的元组后即停止找同样的动作

SQL语句的explain重点分析的属性
  • type:访问类型,查看SQL的数据访问类型,最好优化到ref和range级别
  • key:实际用到的索引,判断是否使用到索引
  • key_len:索引长度,可以根据长度判断组合索引中哪些索引失效,与key配合使用
  • rows:最大扫描行数,
  • extra:重要的额外信息,重点优化useing filesort和useing temporary两个现象
覆盖索引

(covering index)为索引覆盖,查询列要被所建的索引覆盖
如果使用覆盖索引,一定要注意select列表中只取出需要的列,不可用select*
如果所有字段一起作索引会导致索引文件过大,查询性能下降
只要查询列表中是索引字段(主键,索引列,单个或者多个)即可

mysql> explain select age,name,address from tbl_person\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tbl_persontype: index
possible_keys: NULLkey: idx_age_name_addresskey_len: 338ref: NULLrows: 9Extra: Using index

该select列表中都是索引字段,使用了覆盖索引,不会扫描全表,所以尽量避免使用select*

使用到的数据库表
CREATE TABLE `tbl_person` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`address` varchar(100) NOT NULL DEFAULT '' COMMENT '地址',`age` int(4) NOT NULL DEFAULT '0' COMMENT '年龄',`name` varchar(10) NOT NULL DEFAULT '' COMMENT '名称',PRIMARY KEY (`id`),KEY `idx_age_name_address` (`age`,`name`,`address`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

四、MySQL优化之explain执行计划的extra属性相关推荐

  1. mysql执行计划extra_四、MySQL优化之explain执行计划的extra属性

    explain之extra 包含不适合在其他列中显示但十分重要的额外信息 using filesort:文件排序 表明MySQL会对数据使用一个外部的索引排序, 而不是按照表内的索引顺序读取, mys ...

  2. MySQL 优化:Explain 执行计划详解

    昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技术渣仔默默的吃着饭,听大佬们高谈阔论,研究各种高端技术,我TM也想说话可实在插不上嘴. 聊着聊着突然说到他上午面试了一个工作6年的程序员, ...

  3. MySQL — 优化之explain执行计划详解(转)

    EXPLAIN简介 EXPLAIN 命令是查看查询优化器如何决定执行查询的主要方法,使用EXPLAIN,只需要在查询中的SELECT关键字之前增加EXPLAIN这个词即可,MYSQL会在查询上设置一个 ...

  4. MySQL优化篇:执行计划explain中key_len计算方式

    概述 key_len表示索引使用的字节数,根据这个值可以判断索引的使用情况,特别是在使用联合索引的时候,判断该索引有多少部分被使用到非常重要. key_len的长度计算公式很重要(key_len越小, ...

  5. MySQL高级 之 explain执行计划详解

    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...

  6. MySQL数据库:explain执行计划详解

    一.执行计划: 执行计划是SQL语句经过查询分析器后得到的 抽象语法树 和 相关表的统计信息 作出的一个查询方案,这个方案是由查询优化器自动分析产生的.由于是动态数据采样统计分析出来的结果,所以可能会 ...

  7. 高性能mysql 附录D explain执行计划详解

    EXPLAIN: extended关键字:在explain后使用extended关键字,可以显示filtered列和warning信息.在较旧的MySQL版本中,扩展信息是使用EXPLAIN EXTE ...

  8. mysql 执行计划详解,Mysql中的explain执行计划详解(1)

    创建一个表test_explain,并添加入下的数据 mysql> create  table test_explain( a int primary key, b int); Query OK ...

  9. mysql执行计划重用_MySQL 优化之EXPLAN执行计划

    MySQL优化之EXPLAN执行计划 ** 备注 ** 本文改编自https://www.processon.com/view/5d4fe8f4e4b04399f5a0303e?fromnew=1#m ...

最新文章

  1. python学不会的表情包-python这么简单 为何这么多人学不会
  2. 查看python版本号-怎么查看python版本号
  3. 多线程_yield()和sleep()方法比较
  4. 把 textbox 遍历赋值为空
  5. ubuntu(linux)下安装openCV(ffmpeg导致的编译不通过的解决办法)
  6. Linux学习笔记(二)|常用命令
  7. Mysql 中的Text字段的范围
  8. 推荐算法--其他信息(07)
  9. 不同类型的变量与零值比较的方法
  10. Zabbix-1.8.14 安装
  11. leetcode-longestPalindrome-java
  12. DuiLib(一)——窗口及消息
  13. 80端口攻击_使用 ZoomEye 寻找 APT 攻击的蛛丝马迹
  14. 第10课:JSP指令 Page指令 (JSP教程 JSP入门实战教程 黄菊华Java网站开发系列教程)
  15. Spring之事务管理与事务的传播特性
  16. c语言for循环计算100以内奇数的和
  17. 12v工业计算机主机,ARM一体机 工业电脑,低功耗主机 AM3352
  18. Aspose.Words doc转pdf 内容出现丢失,页码跳页,排版混乱问题
  19. 联想E431 win10+Unbutun+Deepin系统安装
  20. ERP系统对接淘宝电商和线下工作人员的问题与解决方案

热门文章

  1. 联想服务器控制口登录地址_服务器常见远程管理网口及登录方式
  2. TurboLaunch启动后无法显示的问题
  3. Tableau笔记(10)转置和拆分
  4. java 图片水印_JAVA实现图片水印
  5. 【计算机网络】已知若干个网络,如何计算汇聚成超网后的地址?
  6. 【向生活低头】win10电脑使用录音机的注意事项
  7. 2019.6.1日关于图书馆借来的基本数据分析和挖掘的书
  8. 前端漂亮的字体 font-family
  9. txfont与\texttt冲突问题
  10. 关于Intellij idea里在pom.xml里添加Maven依赖,本地仓库下拉列表显示包很少的血的经验