《高性能MySQL》之EXPLAIN
使用explain关键字获取sql执行性能
语法如下:
explain select * from table
explain 中的列
expain出来的信息有10列,
分别是id,select_type,table、type,partitions,possible_keys,key,key_len,ref,rows,Extra,下面对这些字段出现的可能进行解释:
1.ID
SQL执行的顺序的标识,SQL从大到小的执行
ID相同时,执行顺序由上至下
如果是子查询,ID的序号会递增,ID值越大优先级越高,越先被执行
ID如果相同,可以认为是一组,从上往下顺序执行;在所有组中,ID值越大,优先级越高,越先执行。
2.select_type
示查询中每个select子句的类型
SIMPLE:简单的SELECT,不实用UNION或者子查询。
PRIMARY:最外层SELECT。
UNION:第二层,在SELECT之后使用了UNION。
DEPENDENT UNION:UNION语句中的第二个SELECT,依赖于外部子查询。
UNION RESULT:UNION的结果。
SUBQUERY:子查询中的第一个SELECT。
DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询。
DERIVED:导出表的SELECT(FROM子句的子查询)
MATERIALIZED:物化子查询
UNCACHEABLE SUBQUERY:无法缓存结果的子查询,必须为外部查询的每一行重新计算
UNCACHEABLE UNION:UNION 属于不可缓存的子查询的第二个或后一个选择
3.table
输出行引用的表的名称。这也可以是以下值之一:
<unionM,N,…>:该行指的是id值为M和id值为N的并集。
:该行是指用于与该行的派生表结果id的值 N。例如,派生表可以来自FROM子句中的子查询
:该行指的是id 值为的行的具体化子查询的结果N
4.type
表示MySQL在表中找到所需行的方式,又称“访问类型”。
常用的类型有: NULL, system, const, eq_ref, ref, range, index, ALL(从左到右,性能从差到好)
以下列表描述了从最佳类型到最差类型的连接类型
(1)NULL
MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
(2)system
该表只有一行(如:系统表)。这是const连接类型的特例
(3)const
该表最多只有一个匹配行,在查询开头读取。因为只有一行,所以优化器的其余部分可以将此行中列的值视为常量。 const表非常快,因为它们只读一次。
获取单个文章详细信息:
EXPLAIN SELECT post_title,post_content,post_date FROM wp_posts WHERE ID =
查询指定分类所有文章:
EXPLAIN SELECT u.`user_nicename`,p.`ID`,p.`post_title`,p.`post_content`,p.`post_date`,p.`post_excerpt`,term.`name`,relation.`term_taxonomy_id`,term.`name` FROM wp_users AS u
LEFT JOIN wp_posts p ON(u.`ID` = p.`post_author`)
LEFT JOIN wp_term_relationships AS relation ON(p.`ID` = relation.`object_id`)
LEFT JOIN wp_term_taxonomy AS taxonomy ON(relation.`term_taxonomy_id` = taxonomy.`term_taxonomy_id`)
LEFT JOIN wp_terms AS term ON(taxonomy.`term_id` = term.`term_id`)
WHERE relation.`term_taxonomy_id` =
ORDER BY p.`post_date`
(4)eq_ref
对于前面表格中的每个行组合,从该表中读取一行。除了 system和 const类型之外,这是最好的连接类型。当连接使用索引的所有部分且索引是 索引PRIMARY KEY或UNIQUE NOT NULL索引时使用它。
获取所有文章分类:
SELECT
term.`term_id`,term.`name` FROM wp_term_taxonomy AS taxonomy LEFT JOIN
wp_terms AS term ON(term.`term_id` = taxonomy.`term_id`)
WHERE
taxonomy.`taxonomy` = 'category'
(5)ref
表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
获取指定用户所有文章
EXPLAIN SELECT
u.display_name,u.user_nicename,p.ID,p.post_title,p.post_content,p.post_date,p.post_modified,p.post_date,p.post_status,p.comment_count
FROM wp_users AS u INNER JOIN wp_posts AS p ON(u.ID=p.post_author)
WHERE p.post_status = "publish"
AND u.user_nicename = 'youcongtech'
ORDER BY p.post_modified DESC LIMIT ,
EXPLAIN SELECT p.`ID`,p.`post_title`,p.`post_content` FROM wp_posts AS p WHERE p.`post_author` IN(SELECT u.`ID` FROM wp_users AS u WHERE u.`ID` = );
(6)fulltext
使用FULLTEXT 索引执行连接。
添加FULLTEXT:
ALTER TABLE wp_posts ADD FULLTEXT INDEX ngram_idx(post_title) WITH PARSER ngram;
全文检索:
EXPLAIN SELECT * FROM wp_posts WHERE MATCH(post_title) AGAINST('HustOJ%' IN BOOLEAN MODE);
(7)ref_or_null
SELECT * FROM ref_table WHERE key_column IS NULL;
(8)range
仅检索给定范围内的行,使用索引选择行的key 输出行中的列指示使用哪个索引。将key_len包含已使用的时间最长的关键部分。该ref列 NULL适用于此类型。
range当一个键柱使用任何的相比于恒定可使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE,或 IN():
根据作者ID查询指定范围内的文章:
EXPLAIN SELECT * FROM wp_posts AS p WHERE p.`post_author` = AND p.`ID` IN(,)
(9)index
该index联接类型是一样的 ALL,只是索引树被扫描。这种情况有两种:
a.如果索引是查询的覆盖索引,并且可用于满足表中所需的所有数据,则仅扫描索引树。在这种情况下,Extra专栏说 Using index。仅索引扫描通常比ALL索引的大小通常小于表数据更快 。
b.使用索引中的读取执行全表扫描,以按索引顺序查找数据行。 Uses index没有出现在 Extra列中。当查询仅使用属于单个索引的列时,MySQL可以使用此连接类型。
获取某一段时间发布的文章总数:
EXPLAIN SELECT COUNT(p.`ID`) FROM wp_posts AS p WHERE p.post_status = 'publish' AND p.`post_date` BETWEEN '2019-08-11 00:00:00' AND '2019-12-15 23:59:59'
(10)ALL
对前面表格中的每个行组合进行全表扫描。如果表是第一个未标记的表 const,通常不好,并且在所有其他情况下通常 非常糟糕。通常,您可以ALL通过添加基于常量值或早期表中的列值从表中启用行检索的索引来避免。
EXPLAIN SELECT p.`post_title`,p.`post_content` FROM wp_posts AS p
5.possible_keys
该possible_keys列指示MySQL可以选择在此表中查找行的索引,指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用
该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。
如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询
6.Key
key列显示MySQL实际决定使用的键(索引)
如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
7.key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
不损失精确性的情况下,长度越短越好
8.ref
表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
9.rows
表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
10.Extra
该Extra列 EXPLAIN输出包含MySQL解决查询的额外信息。以下列表说明了此列中可能出现的值。每个项目还指示JSON格式的输出哪个属性显示Extra值。对于其中一些,有一个特定的属性。其他显示为message 属性的文本
11.partitions(扩展)
记录将与查询匹配的分区。仅在使用PARTITIONS关键字时才显示此列 。非分区表显示null
参考资料链接:
https://segmentfault.com/a/1190000017751405
《高性能MySQL》之EXPLAIN的更多相关文章
- 高性能Mysql笔记 — explain
explain 查看sql的执行计划,只是一个近似结果,一般不会实际执行该sql,如果有子查询就会执行子查询 explain table_name,这儿的table_name含义较广:子查询.unio ...
- 高性能MySQL笔记 第6章 查询性能优化
6.1 为什么查询速度会慢 查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...
- 高性能MySQL --- 读书笔记(1) - 2016/8/2
此书不但帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径.全书包括14章,内容覆盖MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优. ...
- 详解MySQL中EXPLAIN解释命令
Explain 结果解读与实践 基于 MySQL 5.0.67 ,存储引擎 MyISAM . 注:单独一行的"%%"及"`"表示分隔内容,就象分开“第一 ...
- mysql中explain的type的解释
type -- 连接类型 type意味着类型,这里的type官方全称是“join type”,意思是“连接类型”,这样很容易给人一种错觉觉得必须需要俩个表以上才有连接类型.事实上这里的连接类型并非字面 ...
- 《高性能Mysql》讲聚簇索引
<高性能Mysql>原文 聚簇索引如下图为聚簇所有的存储方式,聚簇实际不是一种索引,而是一种数据的存储方式,InnoDB的聚簇事假在同一个结构中保存了B-Tree索引和数据行. 当表有聚簇 ...
- mysql之explain
⊙ 使用EXPLAIN语法检查查询执行计划 ◎ 查看索引的使用情况 ◎ 查看行扫描情况 ⊙ 避免使用SELECT * ◎ 这会导致表的全扫描 ◎ 网络带宽会被浪费 话说工欲善其 ...
- MySQL优化Explain命令简介(一)
最近碰到MySQL需要写入大量数据并查询的场景,于是学习了一下MySQL的查询优化,想找关于explain命令的详细资料,然而网上并没有找全,最后终于在<高性能MySQL>中找到了对这一命 ...
- 高性能mysql:创建高性能的索引
本文系阅读<高性能MySQL>,Baron Schwartz等著一书中第五章 创建高性能的索引的笔记,索引是存储引擎用于快速找到记录的一种数据结构. 索引对于良好的性能非常关键,尤其是当表 ...
- MySQL的EXPLAIN命令用于SQL语句的查询执行计划
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...
随机推荐
- python中的异常处理:厌而不舍
什么是异常? ------异常:不正常的情况 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行.一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Pytho ...
- java课后问题解答
1.当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机 答:当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位 置抛出,可能会导致不同的finall ...
- Python环境搭建-4 pip的安装和使用
pip的安装和使用 我们都知道python有很多的第三方库或者说是模块.这些库针对不同的应用,发挥不同的作用.我们在实际的项目中肯定会用到这些模块.那如何将这些模块导入到自己的项目中呢? Python ...
- Python学习第十三课——re(正则表达式)模块
.的用法 import re s = 'fhsdjakaxdsancjh' # .代表一个元素,完成模糊匹配 res = re.findall("a..x", s) # 找到s中以 ...
- Linux CentOS7 VMware LAMP架构Apache用户认证、域名跳转、Apache访问日志
一.Apache用户认证 vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把111.com那个虚拟主机编辑成如下内容 <Virtu ...
- 浏览器输入URL后HTTP请求返回的完整过程
图:
- vue-router重定向redirect
- MyEclipse JSP页面中文字符不能保存
问题: 就是写HTML+JSP代码时有些中文,保存时提示sava could not be completed. Reason: some characters cannot be mapped ...
- 七 异常处理的两种方式(创建全局异常处理器&自定义异常)
1 创建全局异常处理器 实现HandlerExceptionResolve接口 package com.springmvc01; import javax.servlet.http.HttpServl ...
- Ubuntu 安装MySQL并打开远程连接
首先使用su命令切换到root账户 在用apt-get install mysql-server命令获取到MySQL的服务 等待下载安装,按照提示输入MySQL的密码 安装完成后对mysqld.cnf ...