mysql的优化_第十一篇(查询计划篇)
目录
- Mysql优化(出自官方文档) - 第十一篇(查询计划篇)
- 1 EXPLAIN Output Format
- 2 Extended EXPLAIN Output Format
- 3 Extended EXPLAIN Output Format
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_nameWHERE 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_tableWHERE 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_nameWHERE key_column = 10;SELECT * FROM tbl_nameWHERE key_column BETWEEN 10 and 20;SELECT * FROM tbl_nameWHERE key_column IN (10,20,30);SELECT * FROM tbl_nameWHERE 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> EXPLAINSELECT t1.a, t1.a IN (SELECT t2.a FROM t2) FROM t1\G
*************************** 1. row ***************************id: 1select_type: PRIMARYtable: t1type: index
possible_keys: NULLkey: PRIMARYkey_len: 4ref: NULLrows: 4filtered: 100.00Extra: Using index
*************************** 2. row ***************************id: 2select_type: SUBQUERYtable: t2type: index
possible_keys: akey: akey_len: 5ref: NULLrows: 3filtered: 100.00Extra: Using index
2 rows in set, 1 warning (0.00 sec)mysql> SHOW WARNINGS\G
*************************** 1. row ***************************Level: NoteCode: 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.aIN (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中获取,但是使用者必须要有相关的权限,否则无法获取。
转载于:https://www.cnblogs.com/seancheer/p/11466458.html
mysql的优化_第十一篇(查询计划篇)相关推荐
- 最全MySQL8.0实战教程 22 MySQL的优化 22.4 explain分析执行计划 22.4.1 基本使用
最全MySQL8.0实战教程 文章目录 最全MySQL8.0实战教程 22 MySQL的优化 22.4 explain分析执行计划 22.4.1 基本使用 [黑马程序员MySQL知识精讲+mysql实 ...
- mysql 范围优化_如何优化mysql的范围查询
本文预计分为两个部分: (1)联合索引部分的基础知识 在这个部分,我们温习一下联合索引的基础 (2)联合索引部分的实战题 在这个部分,列举几个我认为算是实战中的代表题,挑出来说说. 正文 基础 讲联合 ...
- mysql sql优化_浅谈mysql中sql优化
说到sql优化,一般有几个步骤呢,在网上看到了一篇很不错的帖子.在这分享一下吧,也是自己学习的一个过程. 一.查找慢查询 1.1.查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; ...
- 阿里对mysql的优化_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...
更多内容:https://www.toutiao.com/i6599796228886626829/?tt_from=weixin&utm_campaign=client_share& ...
- mysql query 优化_第 8 章 MySQL 数据库 Query 的优化
前言: 在之前"影响 MySQL 应用系统性能的相关因素"一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 Query 语句的优化 ...
- mysql 连接 优化_(一)MySQL 连接优化
1.查看连接参数(show variables) mysql> show variables like '%connect%'; +------------------------------- ...
- sql server 缓存_搜索SQL Server查询计划缓存
sql server 缓存 Whenever a query is executed in SQL Server, its execution plan, as well as some useful ...
- sql server 缓存_了解SQL Server查询计划缓存
sql server 缓存 Whenever a query is run for the first time in SQL Server, it is compiled and a query p ...
- mysql 多表联查语句优化_?多表联合查询SQL语句优化
11.27 多表联合查询的优化方式,优化后的SQL及分析 优化方式: 1.尽量不用'*' 2.小表作驱动 3.大表建索引 原本SQL语句: select * from order left join ...
- mysql 服务器优化_如何对MySQL服务器进行调优
如今,社会讲求的就是快速,什么事都要有效率,当然服务器也是要有效率.开发人员不断地开发和部署使用LAMP(?.Apache.MySQL 和 PHP/Perl)架构的应用程序.但是,服务器管理员常常对应 ...
最新文章
- 设置复杂密码为了防范谁? | 每日趣闻
- 用mysqlworkbench生成ER图
- iOS 11开发教程(十二)iOS11应用视图始祖——UIView
- C#窗体控件-组合框控件ComboBox
- STM32F103 CAN中断发送功能的再次讨论
- oracle in与exists的使用
- android图片跳转动画效果,Android实现Activity界面切换添加动画特效的方法
- BZOJ1041:[HAOI2008]圆上的整点(数论)
- 你真的懂软件测试人员的痛苦吗?——目前软件测试5大误区
- Activity的启动流程源码解析
- 日语整理之 自五 他五
- cookie的工作原理
- 2021-07-13网络术语解释
- linux文件误删除该如何恢复?
- ICCV 2017 论文解读集锦
- Codeforces 1153
- 考研政治——马克思三大定律之否定之否定
- OLED显示字符的大小与PCtoLCD2002生成字模
- IOS逆向之汇编基础
- 【turtle库】Python绘制圣诞树
热门文章
- Flutter实战之Dio入门使用
- Alink、Tensorflow on Flink 在京东的应用
- 从开发到生产上线,如何确定集群大小?
- iperf3 网络探测详解(android、iOS、windows)
- 被裁的第50天,我终于拿到心仪公司Offer
- php mysql 组件_Ubuntu20.04安装apache、mysql、php、phpmyadmin、wordpress(一)
- modbus地址扫描_西门子PLC通信编程MODBUS通信举例
- powerquery加载pdf_老板让我汇总PDF文件,我不会,同事用Excel两分钟就搞定
- 背景虚化_背景虚化的效果用手机怎么拍?原来这样简单
- setinterval 和 ajax,JavaScriptsetInterval和“this”解决方案