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的时候,这是除了systemconst最好的情况。

  • 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,refNULL,适用于索引列和一个常量进行对比的情况,包括:=, <>, >, >=, <, <=, 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的优化_第十一篇(查询计划篇)的更多相关文章

  1. mysql系列八、mysql数据库优化、慢查询优化、执行计划分析

    mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. 一.介绍 对mysql优化是一个综合性的技术,主要包括 表的设计合理化(符合3NF) 添加适当索引( ...

  2. MySQL分页优化_别再用offset和limit分页了

    终于要对MySQL优化下手了,本文将对分页进行优化说明,希望可以得到一个合适你的方案. 开始之前,先分享一套MySQL教程,小白入门或者学习巩固都可以看 MySQL基础入门-mysql教程-数据库实战 ...

  3. MySQL SQL优化之in与range查询【转】

    本文来自:http://myrock.github.io/ 首先我们来说下in()这种方式的查询.在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效 ...

  4. mysql数据库优化方法大数据量查询轻松解决

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  5. mysql监控优化(三)慢查询

    顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slowquery,通过设--log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名.慢查询 ...

  6. MySQL数据库优化_索引

    1.添加索引后减少查询需要的行数,提高查询性能 (1) 建表 CREATE TABLE `site_user` ( `id` ) NOT NULL AUTO_INCREMENT COMMENT '自增 ...

  7. MySQL架构优化实战系列3:定时计划任务与表分区

    原创 2016-07-08 汤抗 DBAplus社群 一 定时计划任务 1.概论   mysql计划任务可以定时更新数据库表或者做大文件的汇总表.   2.配置 开启计划任务 SHOW VARIABL ...

  8. MySQL架构优化:定时计划任务与表分区

    转自: MySQL架构优化实战系列3:定时计划任务与表分区 - 今日头条(TouTiao.com)http://toutiao.com/a6304736482361049345/?tt_from=mo ...

  9. Mysql优化_第十三篇(HashJoin篇)

    Mysql优化_第十三篇(HashJoin篇) 目录 Mysql优化_第十三篇(HashJoin篇) 1 适用场景 纯等值查询,不能使用索引 等值查询,使用到索引 多个join条件中至少包含一个等值查 ...

随机推荐

  1. 索引器和ref、out关键字

    这节讲三个小知识:索引器.ref.out. 索引器: 在一个类中,我们可以定义一个索引器,它可以让我们在外部像访问数组元素一样访问类的属性成员. 索引器的定义就像定义属性一样,只不过名称为this,后 ...

  2. 编译课设·CLion到VS踩坑·解决·备忘录

    应试用,VS使用习惯和JB系差别还是蛮大的 打不过他们就加入他们 键位修改 工具-选项 键盘:改keymap 字体和颜色:宋体必改. 自动恢复:自动保存默认3分钟 CMake:自救时可以看一下 键位名 ...

  3. Jenkins 基础篇 - 任务分类

    从前面的小节中我们看到在创建 Jenkins 任务的时候有好几种类型,如果你专门安装了 Maven 相关插件,可能还会有一个[构建一个 maven 项目]的任务类型,那这些任务类型究竟有何区别,以及我 ...

  4. java面试一日一题:java中一个对象实例的结构是什么样子的

    问题:请讲下在java程序运行时一个对象实例的数据结构是什么样子的 分析:该问题主要考察对java中对象的理解,在程序运行过程中一个对象实例是以什么样的形式存在的 回答要点: 主要从以下几点去考虑, ...

  5. 1Spring注入小结

    Spring注入小结 (在Application.xml中) Spring学习笔记 周芋杉2021/5/14 1.基本注入类型注入 注入前的准备 <bean id="#配置文件的唯一标 ...

  6. [bug] PowerDesigner的association按钮灰色不能使用

    参考 https://blog.csdn.net/markely/article/details/44873301

  7. sizeof 的妙用

    (1)sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用.

  8. 关于C语言的指针数组与指针数组的个人理解

    一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...

  9. HUAWEI防火墙通过L2TP隧道让外出员工访问公司内网的各种资源

    组网图形 组网需求 企业网络如图所示,企业希望公司外的移动办公用户能够通过L2TP VPN隧道访问公司内网的各种资源. 操作步骤 配置LNS. 1.配置接口IP地址,并将接口加入安全区域. <L ...

  10. Hadoop MapReduce 一文详解MapReduce及工作机制

    @ 目录 前言-MR概述 1.Hadoop MapReduce设计思想及优缺点 设计思想 优点: 缺点: 2. Hadoop MapReduce核心思想 3.MapReduce工作机制 剖析MapRe ...