目录

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

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

  1. 最全MySQL8.0实战教程 22 MySQL的优化 22.4 explain分析执行计划 22.4.1 基本使用

    最全MySQL8.0实战教程 文章目录 最全MySQL8.0实战教程 22 MySQL的优化 22.4 explain分析执行计划 22.4.1 基本使用 [黑马程序员MySQL知识精讲+mysql实 ...

  2. mysql 范围优化_如何优化mysql的范围查询

    本文预计分为两个部分: (1)联合索引部分的基础知识 在这个部分,我们温习一下联合索引的基础 (2)联合索引部分的实战题 在这个部分,列举几个我认为算是实战中的代表题,挑出来说说. 正文 基础 讲联合 ...

  3. mysql sql优化_浅谈mysql中sql优化

    说到sql优化,一般有几个步骤呢,在网上看到了一篇很不错的帖子.在这分享一下吧,也是自己学习的一个过程. 一.查找慢查询 1.1.查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; ...

  4. 阿里对mysql的优化_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...

    更多内容:https://www.toutiao.com/i6599796228886626829/?tt_from=weixin&utm_campaign=client_share& ...

  5. mysql query 优化_第 8 章 MySQL 数据库 Query 的优化

    前言: 在之前"影响 MySQL 应用系统性能的相关因素"一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 Query 语句的优化 ...

  6. mysql 连接 优化_(一)MySQL 连接优化

    1.查看连接参数(show variables) mysql> show variables like '%connect%'; +------------------------------- ...

  7. sql server 缓存_搜索SQL Server查询计划缓存

    sql server 缓存 Whenever a query is executed in SQL Server, its execution plan, as well as some useful ...

  8. 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 ...

  9. mysql 多表联查语句优化_?多表联合查询SQL语句优化

    11.27 多表联合查询的优化方式,优化后的SQL及分析 优化方式: 1.尽量不用'*' 2.小表作驱动 3.大表建索引 原本SQL语句: select * from order left join ...

  10. mysql 服务器优化_如何对MySQL服务器进行调优

    如今,社会讲求的就是快速,什么事都要有效率,当然服务器也是要有效率.开发人员不断地开发和部署使用LAMP(?.Apache.MySQL 和 PHP/Perl)架构的应用程序.但是,服务器管理员常常对应 ...

最新文章

  1. 设置复杂密码为了防范谁? | 每日趣闻
  2. 用mysqlworkbench生成ER图
  3. iOS 11开发教程(十二)iOS11应用视图始祖——UIView
  4. C#窗体控件-组合框控件ComboBox
  5. STM32F103 CAN中断发送功能的再次讨论
  6. oracle in与exists的使用
  7. android图片跳转动画效果,Android实现Activity界面切换添加动画特效的方法
  8. BZOJ1041:[HAOI2008]圆上的整点(数论)
  9. 你真的懂软件测试人员的痛苦吗?——目前软件测试5大误区
  10. Activity的启动流程源码解析
  11. 日语整理之 自五 他五
  12. cookie的工作原理
  13. 2021-07-13网络术语解释
  14. linux文件误删除该如何恢复?
  15. ICCV 2017 论文解读集锦
  16. Codeforces 1153
  17. 考研政治——马克思三大定律之否定之否定
  18. OLED显示字符的大小与PCtoLCD2002生成字模
  19. IOS逆向之汇编基础
  20. 【turtle库】Python绘制圣诞树

热门文章

  1. Flutter实战之Dio入门使用
  2. Alink、Tensorflow on Flink 在京东的应用
  3. 从开发到生产上线,如何确定集群大小?
  4. iperf3 网络探测详解(android、iOS、windows)
  5. 被裁的第50天,我终于拿到心仪公司Offer
  6. php mysql 组件_Ubuntu20.04安装apache、mysql、php、phpmyadmin、wordpress(一)
  7. modbus地址扫描_西门子PLC通信编程MODBUS通信举例
  8. powerquery加载pdf_老板让我汇总PDF文件,我不会,同事用Excel两分钟就搞定
  9. 背景虚化_背景虚化的效果用手机怎么拍?原来这样简单
  10. setinterval 和 ajax,JavaScriptsetInterval和“this”解决方案