3、Explan执行计划
目录
explain中的列说明
1、id
2、select_type
3、table列
4. type列
NULL:
system,const:
eq_ref
ref
range
index
ALL
possible_keys列
6. key列
7.key_len列
8. ref列
9、rows列
10. Extra列
using index:
using where:
Using index condition:
Using temporary:
using filesort:
Select tables optimized away
是Mysql提供用于分析sql执行性能的工具,如果在sql前使用explan,mysql会对这次查询打上标记,不会真实执行查询,而是模拟sql优化器返回执行计划信息。
explain select * from bus_user;
explain中的列说明
1、id
2、select_type
表示对应行是简单还是复杂的查询,共有5中类型:
SIMPLE:简单查询,不包含子查询和union语句
PRIMARY:复杂查询最外层的表
DERIVED:from后的临时表
SUBQUERY:select后的临时表
explain select id, name,
(select count(*) from bus_order where bus_order.user_id = t1.id) as order_num
from (select * from bus_user where age>18)t1;
UNION:在union后的select
explain select id from bus_user UNION select id from bus_order
3、table列
select 正在访问的表名,如果有子查询的时候,会显示derivedN,其中N表示依赖id=N的查询结果,如果有UNION查询,会显示<union X,Y>,其中X和Y表示参与union的select行id
4. type列
判断sql效率最重要的列,按sql效率,null》system》const》eq_ref》ref》range》index》all,一般来说需要保证查询达到range级别,最好达到ref级别
NULL:
mysql能够在优化阶段直接获得结果,在执行阶段不需要再访问表和索引,例:直接通过索引就可以得到最小id,不需要在执行阶段访问表
explain select max(id) from bus_user;
system,const:
用到主键索引或者唯一索引时,可以将sql的部分进行优化转换成常量,最多匹配1行记录,速度最快。system是const的特例,当表里只有一条数据匹配时为system
explain select * from ( select * from bus_user where id =1) t1;
show warnings;
eq_ref
通过主键或唯一索引,进行关联查询,最多只会返回一条符合条件的记录
explain select bus_user.id from bus_user left join bus_order on bus_user.id=bus_order.id
ref
使用普通索引或者使用满足唯一联合索引的左列原则,可能返回多条符合条件的记录
explain select * from bus_user where name = '123'
班级(class)和学号(num)组成联合唯一索引,使用左列原则查询class:
explain select name from bus_user where class_ = '123'
range
使用like 'a%', in, between,>,<,>=等操作中,使用一个索引来检索给定范围的行
explain select name from bus_user where name like '1%'
index
全表扫描,但是二级索引的字段已经包含需要返回的字段,不需要回表查询,属于覆盖索引
explain select name from bus_user
ALL
全表扫描,扫描聚簇索引的所有叶子节点,性能最差
explain select * from bus_user
possible_keys列
这一列显示的是可能使用到的索引,但是只实际执行中不一定会被使用,这个取决于sql优化器的判断,比如is null 或者is not null,not in这种对实际检索帮助不大的索引,mysql认为还不如全表扫描来的来,就会使用全表扫描。
explain select * from bus_user where id is not null
6. key列
在sql执行过程中会使用到的索引,如果这一列为null,建议优化sql或者创建合适的索引。在某些情况下possible_key有值,而key没有值一般是优化器任务索引的帮助性不大,如果你任务优化器的判断有误,你也可以使用force index强制使用索引或ignore index强制忽略索引。
7.key_len列
这是非常重要的一列,带表使用到的索引字节数,可以根据这个值判断用到了联合索引中的哪几个列
explain select name from bus_user where class_ = '123'
explain select name from bus_user where class_ = '123' and num_='111'
key_len计算规则如下:
timestamp:4字节
如果字段允许为 NULL,需要1字节记录是否为 NULL
8. ref列
索引使用的资源引用,可能是列名也可能是常量
explain select bus_user.id from bus_user left join bus_order on bus_user.id=bus_order.id
9、rows列
这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数,因为并没有具体执行,数值并不准确
10. Extra列
这一列展示的是额外信息。常见的重要值如下:
using index:
覆盖索引:使用二级索引检索,且不需要回表,属于理想状态
explain select name from bus_user where name = '123'
using where:
没有用到索引,这种情况一般建议优化索引
explain select *from bus_user where update_time = '123'
Using index condition:
对索引使用了范围查询,例如>,<.between,like
explain select * from bus_user where name like '123%'
Using temporary:
使用了临时表来排列收集的数据,此时建议索引优化
explain select distinct update_time from bus_user
explain select distinct name from bus_user
using filesort:
需要特别注意,使用了非索引字段进行排序,如果数据少则在内存中排序,如果数据量大可能会使用在磁盘上处理,这种情况需要尽量避免,一般考虑使用索引优化
explain select * from bus_user order by update_time
explain select name from bus_user order by name
Select tables optimized away
使用了某些函数来直接访问索引字段,不需要访问表数据
explain select min(id) from bus_user
3、Explan执行计划相关推荐
- mysql执行计划重用_MySQL 优化之EXPLAN执行计划
MySQL优化之EXPLAN执行计划 ** 备注 ** 本文改编自https://www.processon.com/view/5d4fe8f4e4b04399f5a0303e?fromnew=1#m ...
- DB2执行计划 db2 explan
explain 1.如果第一次执行,请先(在dbinst用户下) connect to dbname, 执行db2 -tvf $HOME/sqllib/misc/EXPLAIN.DDL建立执行计划表 ...
- MySQL性能分析工具的使用:慢查询日志、EXPLAN的使用、分析优化器执行计划:trace、MySQL监控分析视图-sys schema
文章目录 1.数据库服务器的优化步骤 2.查看系统性能参数 2.1 语法 2.2 常用参数 3.统计SQL的查询成本:last_query_cost 4.定位执行慢的SQL:慢查询日志 4.1 慢查询 ...
- 获取执行计划——EXPLAN PLAN
一般获取执行计划有四种途径:1.执行explain plan,查询结果输出表.2.查询动态性能视图,它显示缓存在库缓存中的执行计划(有时查不出结果是因为执行计划已经不在库缓存中).3.查询AWR或St ...
- mysql explain plan_获取执行计划EXPLAN PLAN
一般获取执行计划有四种途径:1.执行explain plan,查询结果输出表.2.查询动态性能视图,它显示缓存在库缓存中的执行计划(有时查不出结果是因为执行计划已经不在库缓存中).3.查询AWR或St ...
- ORACLE 执行计划2
SQL>set timing on --显示Elapsed执行总时间.区别于set time on 方式一: SQL>s ...
- PostgreSQL中的执行计划
PostgreSQL中的执行计划 EXPLAN 预生成执行计划 EXPLAN sql 真实执行计划 explan analyze sql 输出详细内容 explan(analyze on, timin ...
- mysql的索引和执行计划
一.mysql的索引 索引是帮助mysql高效获取数据的数据结构.本质:索引是数据结构 1:索引分类 普通索引:一个索引只包含单个列,一个表可以有多个单列索引. 唯一索引:索引列的值必须唯一 ,但允许 ...
- Explain 执行计划详解
什么是执行计划 我们往往通过慢查询日志,可以找到慢查询的sql具体是怎么写的.我们往往可以通过表的索引,执行引擎等等去自己判断sql为什么执行缓慢的原因.但是这明显不是高效的. 我们的MySQL中为我 ...
最新文章
- 如何在 Windows 中检查计算机正常运行时间
- JavaScript(四)——面向对象编程、BOM、DOM、表单验证、jQuery
- python内置函数返回序列中最大元素_Python之路(第八篇)Python内置函数、zip()、max()、min()...
- 解决:SyntaxError: Non-UTF-8 code starting with '\xe6' in file
- php中的active,用ActivePHP打造版本管理系统
- python遥感影像分类代码_Python 实现遥感影像波段组合的示例代码
- IT运维服务整体方案(资料下载)
- Pr:制作片尾滚动字幕(基本图形法)
- 2019最新个税计算_python
- 先进事迹计算机维护与维修,汽车维修工先进事迹
- ardupilot 函数output_armed_stabilizing
- 软件测试需要学习哪些技能?
- MySQL:指定索引+事务+存储引擎的配置 开发必备 天呐!为什么会有索引这种东西
- Word一部分内容分为两栏或多栏的方法
- 新华三comware开发部怎么样_未来网络什么样?新华三是这么说的
- Oracle存储过程基本语法 存储过程
- hust 1570 Lazy. Lazy. Laaaaaaaaaaaazy!
- 五千字长文为你揭秘滴滴共享出行派单算法原理(干货)
- 常见的http服务器软件
- java输入和输出路径_Java输入输出