mysql查询优化explain命令详解-阿里云开发者社区

开发者社区> java技术栈> 正文

mysql查询优化explain命令详解

简介: ​mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式。explain翻译即解释,就是看mysql语句的查询解释计划,从解释计划我们能很清楚的看到解释的语句有没有合理用到索引,扫描了多少行数,有没有触及全表扫描、用到临时表等影响慢查询的原因。
+关注继续查看

​mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式。explain翻译即解释,就是看mysql语句的查询解释计划,从解释计划我们能很清楚的看到解释的语句有没有合理用到索引,扫描了多少行数,有没有触及全表扫描、用到临时表等影响慢查询的原因。

使用很简单,如

explainselect * from user ...

执行后会出现解释计划的表格,意义可参考下面的参数,针对这些解释计划,我们可以作为相对应的优化。

idmysql查询标识符,即序号。

select_type查询类型

simple:即简单select 查询,不包含union及子查询;

primary:最外层的 select 查询;

union:表示此查询是 union 的第二或随后的查询;

dependent union:union 中的第二个或后面的查询语句, 取决于外面的查询;

union result:union的结果;

subquery:子查询中的第一个select;

dependent subquery:子查询中的第一个select,取决于外面的查询,即子查询依赖于外层查询的结果。

table所有查询到的表。

type联接类型,比较重要的项,从这一项可以看出是否高效的重要依据

性能从好到坏依次如下:

system:表中只有一条数据,这是一个特殊的const 类型;

const:针对主键或唯一索引的等值查询扫描,最多只返回一行数据,const 查询速度非常快,因为它仅仅读取一次即可;

eq_ref:此类型通常出现在多表的 join 查询,表示对于前表的每一个结果,都只能匹配到后表的一行结果,并且查询的比较操作通常是=, 查询效率较高;

ref:此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了 最左前缀 规则索引的查询;

fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引;

ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多;

unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值;

index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重;

index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见and,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取所个索引,性能可能大部分时间都不如range;

range:表示使用索引范围查询,通过索引字段范围获取表中部分数据记录。这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN操作中,此时输出的 ref 字段为 NULL并且key_len字段是此次查询中使用到的索引的最长的那个;

index:全表扫描,只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序,但是开销仍然非常大,这种情况时, Extra 字段会显示 Using index;

all:性能最差的情况,使用了全表扫描,系统必须避免出现这种情况。

possible_keys可能用到的索引。

key真正用到的索引。

key_len使用了索引字节的长度。

ref显示索引的哪一列被使用了。

rows扫描了多少行数,也是性能评估的重要依据。

extra额度信息,常见的有以下几种。

Distinct:一旦找到了与行相联合匹配的行就不再搜索了;

Using filesort:使用了文件排序,性能非常慢,需要优化。

Using index:查询使用到了索引,列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候。

Using temporary:使用了临时表排序,性能非常慢,需要优化。

Using where:表示使用了where进行查询,不是很重要。

ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,需要优化。

具体的对执行计划解释可以参考msyql官网:

https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

扩展

另外,mysql5.6增加了对insert/update/delete的explain支持,用法一样。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
mysql查询拼接
1 不同于sqlserver ,不能使用”+”,”+”号是使用字符转为数字处理,无法转换则忽略 select '11'+'12','abc'+1 from dual; 结果如下图: 使用concat()函数 select concat('11','12') from dual; select concat('11',12) from dual;
817 0
mysql 查询结果异常分析
--- title: MySQL · mysql · mysql 查询结果异常分析 author: 张远 --- # 现象 查询条件类型变化后,查询出了不正确的结果。 ``` create table t1(id int primary key, a varchar(50) DEFAULT NULL, key idx_a(a)) engine=innodb; sho
1617 0
要精通SQL优化?那就学一学explain吧!
要SQL优化,首先要知道哪些地方需要优化。
220 0
sql 查询优化小计
    好久没更博了,偷偷的抽时间写一下。     早上开始working的时候,发现一个页面加载很慢,经排查是昨天写的一条联合查询的sql导致的。于是着手优化!     首先想到的是在join的时候,减少表体积之后再进行关联,于是有了下面这种写法: (原sql) a join b on a.
674 0
Sql Server中百万级数据的查询优化
原文:Sql Server中百万级数据的查询优化 万级别的数据真的算不上什么大数据,但是这个档的数据确实考核了普通的查询语句的性能,不同的书写方法有着千差万别的性能,都在这个级别中显现出来了,它不仅考核着你sql语句的性能,也考核着程序员的思想。
1467 0
Linux 命令详解(一)export 命令
一、Windows 环境变量   1、在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错误。
1296 0
+关注
java技术栈
Java技术栈是一个以 Java 技术为主的原创技术公众号。分享技术包括但不限于 Java 核心技术、多线程编程、Spring Boot、Spring Cloud、缓存、消息队列、架构设计等各种技术干货、Java 面试题、各种技术教程、行业动态等。
182
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载