mysql的优化_第十一篇(查询计划篇)
Mysql优化(出自官方文档) - 第十一篇(查询计划篇)
1 EXPLAIN Output Format
由于EXPLAIN的内容较多,所以这里只会摘录一些重要的地方,详情可以参考原文。
EXPLAIN的结果解释:
Column | JSON Name | Meaning |
---|---|---|
id |
select_id |
The SELECT identifier |
select_type |
None | The SELECT type |
table |
table_name |
The table for the output row |
partitions |
partitions |
The matching partitions |
type |
access_type |
The join type |
possible_keys |
possible_keys |
The possible indexes to choose |
key |
key |
The index actually chosen |
key_len |
key_length |
The length of the chosen key |
ref |
ref |
The columns compared to the index |
rows |
rows |
Estimate of rows to be examined |
filtered |
filtered |
Percentage of rows filtered by table condition |
Extra |
None | Additional information |
摘一些重要的列:
table
即表名,但是也有可能是下面三种情况。
<union*M*,*N*>
:表示多个表的union
,其中M和N分别为第一列的id
<derived*N*>
:表示来自于其他表的衍生表,同上,M和N表示第一列的id
,通常,衍生表来自于from
语句后面的select
<subquery*N*>
: 表示物化后的子查询,N为第一列的id
。
partitions
对于有分区的表该列有效
type
即
join type
,分别有常见的system``, const, eq_ref, ALL
等, 下一节将详细介绍。possible_keys
表示待选的索引
key
表示实际上用到的索引,来自于
possible_keys
,当possible_keys
不为NULL
的时候,该列也有可能为none
,因为有时候用索引的效率不定义会比扫表高。key_len
Mysql决定使用索引的长度(哪些部分),当一列有可能为
NULL
的时候,key_len
的长度可能比该列大。ref
表示用来和索引比较的常量或者某一列。
rows, filtered
rows
表示Mysql预估将要扫描的行数,filtered
表示Mysql预估的能过滤的行数(这里值的是返回给用户的行数),比如rows为100, filtered为70%,那么Mysql预估返回给用户70行数据。Extra
表示Mysql解析一个query的一些额外信息,比如
Using Index,Using filesort
等等。
EXPLAIN Join Types
对于type列,经常用于join
的场景,下面将根据效率由高到低进行说明:
system
const
的一种特殊情况,表示该表只有一行数据const
表示只有最多只有一行匹配的数据,虽然该表可能有多行数据,但是对于和其join的表,其只需要一行数据,可以视作为
const
,经常用于primary key
或者unique key
中,比如下面的语句:SELECT * FROM tbl_name WHERE primary_key=1; SELECT * FROM tbl_name
WHERE primary_key_part1=1 AND primary_key_part2=2;
eq_ref
Mysql可以使用索引进行equal操作,只适用于equal的情况,并且索引类型必须为
primary key
或者unique not null
,在join的时候,这是除了system
和const
最好的情况。ref
当一个索引不是
primary key
或者unique index
的时候,又或者只能使用leftmost的时候,就会使用到ref
的情况,适用于=
或者<=>
fulltext
ref_or_null
和ref很像,但是除此之外,还需要额外寻找null字段,经常用于一些子查询的情况,比如下面的语句:
SELECT * FROM ref_table
WHERE key_column=expr OR key_column IS NULL;
index_merge
表示会使用Section 8.2.1.3, “Index Merge Optimization”.技术进行优化
unique_subquery
和
eq_ref
等价的情况,不过是针对于子查询的,譬如下面的语句:value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery
和
unique_subquery
很像,不过是针对于子查询中的nonunique index
的,譬如下面的语句:value IN (SELECT key_column FROM single_table WHERE some_expr)
range
一般索引的范围查找会用到,该种情况下,
key
列表示所使用的索引,key_len
表示所使用的最长的key part,ref
是NULL
,适用于索引列和一个常量进行对比的情况,包括:=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE, 或者IN
,譬如下面的语句:SELECT * FROM tbl_name
WHERE key_column = 10; SELECT * FROM tbl_name
WHERE key_column BETWEEN 10 and 20; SELECT * FROM tbl_name
WHERE key_column IN (10,20,30); SELECT * FROM tbl_name
WHERE key_part1 = 10 AND key_part2 IN (10,20,30);
index
类似于
ALL
,不过这种情况下是索引扫描,通常情况下,Extra
列为Using Index
ALL
最糟糕的情况,这种情况下只能进行全表扫描,此时应该考虑创建索引来加快
join
的速度。
EXPLAIN Extra Information
该小节省略,因为Extra
列的信息都比较易懂,碰到不清楚的可参考这里。
2 Extended EXPLAIN Output Format
在EXPLAIN
之后,执行SHOW WARNINGS
命令,会看到EXPLAIN
的一些附加信息,在8.0.12
之后,该附加信息的适用条件为:SELECT, DELETE, INSERT, REPLACE和UPDATE
,在8.0.12
之前,该附加信息只有在SELECT
语句下才会产生,看下面的一个例子:
mysql> EXPLAIN
SELECT t1.a, t1.a IN (SELECT t2.a FROM t2) FROM t1\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: t1
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 4
filtered: 100.00
Extra: Using index
*************************** 2. row ***************************
id: 2
select_type: SUBQUERY
table: t2
type: index
possible_keys: a
key: a
key_len: 5
ref: NULL
rows: 3
filtered: 100.00
Extra: Using index
2 rows in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: /* select#1 */ select `test`.`t1`.`a` AS `a`,
<in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in
( <materialize> (/* select#2 */ select `test`.`t2`.`a`
from `test`.`t2` where 1 having 1 ),
<primary_index_lookup>(`test`.`t1`.`a` in
<temporary table> on <auto_key>
where ((`test`.`t1`.`a` = `materialized-subquery`.`a`))))) AS `t1.a
IN (SELECT t2.a FROM t2)` from `test`.`t1`
1 row in set (0.00 sec)
注意,可以看到这些查询语句可能会被重写,且包含特殊的标记符,所以这些语句不一定是合法的SQL
语句,该语句只是为了表示Mysql是如何具体来解析和执行的。
对于这些特殊的标记,部分解释如下:
<auto_key>
为临时自动生成的key
(expr)
表示该语句会被缓存在内存中,以后可能会使用到。
(query fragment)
表示语句被重写成了EXISTS等等,还有很多,这里就不一一介绍了。
3 Extended EXPLAIN Output Format
EXPLAIN FOR CONNECTION
语句用于一些性能诊断的情况,比如:一个session
执行的时间很长,那么可以在另外一个session
中使用该命令,指定特定的connection id
,那么就可以看到之所以执行这么长时间的额原因,该命令的格式如下:
EXPLAIN [options] FOR CONNECTION connection_id;
该命令适用于 SELECT
, DELETE
, INSERT
, REPLACE
, and UPDATE
. 但是,该命令不适用于任何prepared语句。
connection_id
是一个conection
的标识符,该id
可从 INFORMATION_SCHEMA
PROCESSLIST
table or the SHOW PROCESSLIST
statement中获取,但是使用者必须要有相关的权限,否则无法获取。
mysql的优化_第十一篇(查询计划篇)的更多相关文章
- mysql系列八、mysql数据库优化、慢查询优化、执行计划分析
mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. 一.介绍 对mysql优化是一个综合性的技术,主要包括 表的设计合理化(符合3NF) 添加适当索引( ...
- MySQL分页优化_别再用offset和limit分页了
终于要对MySQL优化下手了,本文将对分页进行优化说明,希望可以得到一个合适你的方案. 开始之前,先分享一套MySQL教程,小白入门或者学习巩固都可以看 MySQL基础入门-mysql教程-数据库实战 ...
- MySQL SQL优化之in与range查询【转】
本文来自:http://myrock.github.io/ 首先我们来说下in()这种方式的查询.在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效 ...
- mysql数据库优化方法大数据量查询轻松解决
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- mysql监控优化(三)慢查询
顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slowquery,通过设--log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名.慢查询 ...
- MySQL数据库优化_索引
1.添加索引后减少查询需要的行数,提高查询性能 (1) 建表 CREATE TABLE `site_user` ( `id` ) NOT NULL AUTO_INCREMENT COMMENT '自增 ...
- MySQL架构优化实战系列3:定时计划任务与表分区
原创 2016-07-08 汤抗 DBAplus社群 一 定时计划任务 1.概论 mysql计划任务可以定时更新数据库表或者做大文件的汇总表. 2.配置 开启计划任务 SHOW VARIABL ...
- MySQL架构优化:定时计划任务与表分区
转自: MySQL架构优化实战系列3:定时计划任务与表分区 - 今日头条(TouTiao.com)http://toutiao.com/a6304736482361049345/?tt_from=mo ...
- Mysql优化_第十三篇(HashJoin篇)
Mysql优化_第十三篇(HashJoin篇) 目录 Mysql优化_第十三篇(HashJoin篇) 1 适用场景 纯等值查询,不能使用索引 等值查询,使用到索引 多个join条件中至少包含一个等值查 ...
随机推荐
- python3读取文件指定行的三种方案
技术背景 考虑到深度学习领域中的数据规模一般都比较大,尤其是训练集,这个限制条件对应到实际编程中就意味着,我们很有可能无法将整个数据文件的内容全部都加载到内存中.那么就需要一些特殊的处理方式,比如:创 ...
- JAVA并发(2)-ReentrantLock的见解
上节,我们讲了AQS的阻塞与释放实现原理,线程间通信(Condition)的原理.这次,我们就讲讲基于AQS实现的ReentrantLock(重入锁). 1. 介绍 结合上面的ReentrantLoc ...
- [bug] httpd服务启动问题
参考 httpd服务器启动失败 https://www.cnblogs.com/Crazy-Liu/p/11550824.html Apache-httpd服务器启动成功网页却不能访问 https:/ ...
- 如何使用ghost备份系统?
如何使用ghost备份系统? 如何使用ghost工具电脑系统备份?需要具体的详细步骤 关注者 11 被浏览 13,197 关注问题写回答 邀请回答 添加评论 分享 1 个回答 默认排 ...
- Linux 操作系统(一)命令&用户&权限
以下实例均在Centos7下验证 Centos7 查看命令帮助 man xxx 常用命令 ls / cd - #切到上次目录 cd #回家 cat cat f1 f2 cat f1 f2>f3 ...
- HAProxy与LVS综合----搭建LNMP源码编译结合HAProxy或LVS负载均衡
实战一:实现LNMP与Keepalived.HAProxy做反向代理 框架图: 实现原理: 1.当A用户访问网站时,此时需要经过防火墙,防火墙将用户访问的IP地址处理后,如果允许访问,则就访问到HAr ...
- Linux服务之批量部署篇
批量部署步骤: 1.检查环境 getenforce #检查内核防火墙是否关闭 systemctl status firewalld #检查firewalld是否 ...
- centos更新git
安装完centos 7后默认的git版本为1.8,有些软件需要更新版本的git,但是在yum库中并没有更高的git版本,所以需要下载安装包进行手动安装,git下载地址:https://git-scm. ...
- 拖动登录框 HTML+CSS+js
先上效果 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- 使用Typora编写Markdown你真的会了吗
目录 Typora 介绍 使用 常用快捷键 概述 标题 一级标题 二级标题 方式(推荐) 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 粗体斜体删除线 下划线 注释 分割线 脚注 ...