MySQL执行计划复习
MySQL执行计划分析
Ⅰ、认识执行计划的每个字段
(root@localhost) [(none)]> desc select 1;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set, 1 warning (0.00 sec)
1.1 id
- 单纯的join,id都是1,且从上到下
- subquery、scala subquery都会使id递增
1.2 select type
- simple
- 不使用union或者subquery的简单query
- 子查询被优化器打开,失效了
- primary
- 使用union结合select时,第一个select type
- subquery的query
- union
- 使用union结合select除了第一个select type为primary,其余为union(extra中union result是union去掉重复值的临时表)
- 5.7开始union all不会出现union result,因为不去重
- subquery
- 不是用在from后面的subquery
- 和外部表无关联
- subquery(标量子查询)执行计划没错误,不代表sql执行没错(不能超过1行数据,subquery return more than 1 row)
- dependent subquery
- 必须依附于外面的值
- scala subquery(和外部有关系的标量子查询)
- exists
- derived
- from位置之后的subquery
- derived是生成在内存或者临时表空间中
- 如果derived作驱动表时,要点是减少数据量
- 当作被驱动表时产生auto_key索引,也是以减少数据量为目
- 5.7中optimizer_switch='derived_merge=on'可以把简单subquery打开成join
- derived_merge为on时被驱动表的连接条件要有索引,为off时被驱动表结果集要小
- 5.7的derived_merge可能导致子查询中order by失效
- 5.7以下操作可以防止derived_merge
- unin/union all
- group by
- distinct
- 聚合函数
- limit
- @
- materialized
- 物化,5.7开始in会产生,也会生成auto_key索引
- in中使用hint QB_NAME,外层使用这个hint
- select /*+ semijoin(@sub MATERIALIZATION) / * from t_order t2 where t2.emp_no in (select /+ QB_NAME(sub) */ t1.emp_no from dept_emp t1);
1.3 table
- NULL
- 表示不使用任何表
- 使用dual
- extra中出现select tables optimized away,多见于count操作
- 表名或者表的别名
- <derived+ id><union + id>
- 临时表<>里的数字是id列
- tmp_table_size = max_heap_table_size适当调大
1.4 type
- const
- 使用primary key或者unique key取得一条数据
- eq_ref
- join,且满足被驱动表的连接条件unique key或者primary key
- ref
- 对索引列做等号判断
- range
- between in like > <
- 和const的区别在于索引扫描范围不一样
- index
- 索引全扫描,比扫全表且order by的情况快,但是绝大部分情况下也是优化对象
- 不能使用range,const,ref的情况下,且只查询索引列,即不回表,使用索引进行排序或者聚合即省略排序
- 索引(a,b),select a from xxx where b = ''; 即联合索引中前导列不在where条件中,且查询列在索引中
- 在聚合运算中group by后面的列在索引或者primary key中,且查询列也在索引中
- all
- 全表扫描
- 大表中查询超过一半以上的值,效果更好
- 索引失效
- 无索引
- 对索引列加工
- 索引列隐式类型转换
- 对日期类型进行like '20xxx'
- 单列索引,对数字列进行like '30%'
1.5 possible_keys
- 列出可能用到的索引,对优化没什么帮助
- 5.6之后开始支持auto_key
- auto_key就是临时创建索引,需要消耗一些内存和cpu,对tmp_table_size,max_heap_table_size依赖较大
- mysql列大小超过767个字节,无法生成auto_key
- convert(xxx,数据类型,字符集)
1.6 key
- sql用到的索引
1.7 key_len
- 显示sql到底使用了多少索引
1.8 ref
- 只有type是ref或者const才会出现内容,没啥用,不用管
1.9 rows
- MySQL优化器根据统计信息预估出来的值,不准
1.10 filter
- 和rows一样是预估值,非100的情况是extra有using where关键字,表示从存储引擎中拿到数据后再加工的比例
- 5.7开始该值比较准确
1.11 Extra
- Distinct
- MySQL在join过程中取出一行之后查询另一个表时,碰到一行就停止,有点像exsits
- 必须是join
- distinct关键字
- select列上只能含有驱动表的字段
- 使用straight_join hint可以强制改变驱动表
- select tables optimized away
- 查询中只有min、max的时候出现,有时候count貌似也会出现
- 联合主键,其中任一一个字段用等值查询,查出另一个字段的min或max,且不能包含group by
- Using filesort
- order by, group by且没使用索引
- 8.0 group by不会出现
- Using index
- 只使用索引不回表就可以查到
- 如果表对应的where条件选择率不是很好,且一行长度很长,此时课考虑创建包含对应列的索引达到减少物理io的目的
- 延迟join必须使用using index,否则无效
- Using temporary
- sql执行过程中存储中间结果会使用tempoary table,但无法判断在内存还是disk
- order by,group by未使用索引
- 执行计划中的select type为derived
- show swssion status like '%tmp%'
- max_heap_table_size和tmp_table_size(不一致时以小的为准)
- Using where
- 一般和filtered,rows一起看
- 表示从存储引擎中拿到数据再过滤
- rows是存储引擎中拿数据的预估值,filtered是再过滤的百分比
- Using index condition
- 必须是二级索引才有,且有索引后面部分无法使用时,回表次数很大,效果更好
- optimizer_switch='index_condition_pushdown=on'
- Using MRR
- optimizer_switdch='mrr_cost_based=0ff'
- 回表之前先排序,降低随机io
- Range checked for each record
- type为all
- 这是优化对象,紧接着用show warnings来定位问题
- Using join buffer(Block Nested Loop)
- optimizer_switch='block_nested_loop=on,batched_key_access=on'
- 被驱动表没有索引且数据量较少的时候,一般这种情况也是优化对象
Ⅱ、获取运行中SQL的执行计划
desc for connection connection_id;
MySQL执行计划复习的更多相关文章
- MySQL执行计划解读
Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得 ...
- mysql执行计划
烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长.如何写好sql,学会看执行计划至关重要.下面我简单讲讲mysql的执行计划,只列出了一些常见的情况, ...
- 如何查看MySQL执行计划
在介绍怎么查看MySQL执行计划前,我们先来看个后面会提到的名词解释: 覆盖索引: MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件 包含所有满足查询需要的数据的索引 ...
- 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执行计划
使用navicat查看mysql执行计划: 打开profile分析工具: 查看是否生效:show variable like ‘%profil%’; 查看进程:show processlist; 选择 ...
- MySQL 执行计划explain详解
MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但 ...
- MYSQL 执行计划
Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得 ...
- MySQL执行计划extra中的using index 和 using where using index 的区别
本文出处:http://www.cnblogs.com/wy123/p/7366486.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
随机推荐
- xls添加 序号列技巧
问题背景:在给xls添加一列序列时常碰到一个问题,用下拉很不科学(如果行数很多):用双击需要右边有一列不断开的数据列. 方法一:在A1 =row()回车,选择范围,快捷键 ctrl+d, 复制其文 ...
- Pycharm工具导入requests包(python新手)
在学习使用python的过程中选择了工具Pycharm,但是如下代码: ,起初导包一直报错,解决办法:File->Setting 点击右上角+号,打开搜素对话框 搜素需要的导包,并加入即可解决此 ...
- NB-IoT不一定最完美 但足以成为决定ofo与摩拜物联网胜负的关键【转】
转自:http://news.rfidworld.com.cn/2017_11/3d5ed5c5d8cb9949.html 2018年到来之前,如果还不懂物联网,你会被淘汰. 今年1月,工信部< ...
- 【原创】大数据基础之HDFS(1)HDFS新创建文件如何分配Datanode
HDFS中的File由Block组成,一个File包含一个或多个Block,当创建File时会创建一个Block,然后根据配置的副本数量(默认是3)申请3个Datanode来存放这个Block: 通过 ...
- Java学习之Java接口回调理解
Java接口回调 在Java学习中有个比较重要的知识点,就是今天我们要讲的接口回调.接口回调的理解如果解释起来会比较抽象,我一般喜欢用一个或几个经典的例子来帮助加深理解. 举例:老板分派给员工做事,员 ...
- 浏览器兼容html头部<meta>标签主要内容详情
<!DOCTYPE html> <head> <meta http-equiv="X-UA-Compatible" content="IE= ...
- Windows Internals 笔记——内核对象
1.每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问.这个内存块是一个数据结构,其成员维护着与对象相关的信息. 2.调用一个会创建内核对象的函数后,函数会返回一个句柄,它标 ...
- sklearn模型的属性与功能-【老鱼学sklearn】
本节主要讲述模型中的各种属性及其含义. 例如上个博文中,我们有用线性回归模型来拟合房价. # 创建线性回归模型 model = LinearRegression() # 训练模型 model.fit( ...
- 用PHPExcel导出导入Excel
thinkPHP5.0框架 查询数据库调用Excel方法 public function exportlist(){ $orderModel = new OrderModel(); if($start ...
- SparkCore| 算子
RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象.代码中是一个抽象类,它代表一个弹性的.不可变.可分区.里面的元素可并行 ...