mysql优化--explain

  • explain模拟优化器执行sql语句。
  • 显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句
  • 常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描
  • 使用方法:在select语句前加上explain就可以了

例如:

explain select * from user u left join company c on c.id=u.company_id;

expain出来的信息有11列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、filtered、Extra

概要描述:

id:选择标识符

select_type:表示查询的类型。

table:输出结果集的表

partitions:匹配的分区

type:表示表的连接类型

possible_keys:表示查询时,可能使用的索引

key:表示实际使用的索引

key_len:索引字段的长度

ref:列与索引的比较

rows:扫描出的行数(估算的行数)

filtered:按表条件过滤的行百分比

Extra:执行情况的描述和说明

解释:

  1. id:sql执行顺序的标识,sql从大到小的执行
    1. id相同时,执行顺序由上至下
    2. 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
    3. id如果相同,可认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高 越先执行
  2. select_type:显示查询中每个select子句的类型
    1. SIMPLE(简单SELECT,不使用UNION或子查询等)
    2. PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
    3. UNION(UNION中的第二个或后面的SELECT语句)
    4. DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
    5. UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)
    6. SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
    7. DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)
    8. DERIVED(派生表的SELECT, FROM子句的子查询)
    9. UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
  3. table:显示这一行的数据是关于哪张表
  4. type:显示连接使用了何种类型,

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref。

  1. possible_keys:显示可能应用在这张表中的索引
  2. key:实际使用的索引,如果为null,则没有使用索引

很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

  1. key_len:表示索引中使用的字节数。

不损失精确性的情况下,长度越短越好

  1. ref:表示上述表的连接匹配条件。即哪些列或常量被用于查找索引列上的值
  2. rows:估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
  3. extra:该列包含mysql解决查询的详细信息
    1. Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
    2. Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by
    3. Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”

总结:

• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况

• EXPLAIN不考虑各种Cache

• EXPLAIN不能显示MySQL在执行查询时所作的优化工作

• 部分统计信息是估算的,并非精确值

• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

通过收集统计信息不可能存在结果

EXPLAIN

SELECT

u. NAME AS u_name ,

`sr`.*, `u`.`mobile` ,

`c`.`company_name`

FROM

kl_user_search_record sr

LEFT JOIN `kl_user` `u` ON `u`.`unique_code` = `sr`.`unique_code`

LEFT JOIN `kl_company` `c` ON `c`.`id` = `sr`.`company_id`

GROUP BY

`sr`.`id`

ORDER BY

`sr`.`id` DESC

原文地址:https://www.cnblogs.com/zwtqf/p/11330025.html

时间: 2024-10-16 06:35:01

mysql优化--explain的相关文章

mysql优化--explain分析sql语句执行效率

Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select - from - [where -] 例如:explain select * from news; 输出:+----+-------------+-------+-------+-------------------+---------+-

mysql优化--explain关键字

MySQL性能优化---EXPLAIN 参见:https://blog.csdn.net/jiadajing267/article/details/81269067 参见:https://www.cnblogs.com/clphp/p/5403215.html explain关键字用于分析sql语句的执行情况,可以通过他进行sql语句的性能分析. 对explain查询出来的结果含义进行分析: id值的含义: ? id为语句的查询序号,也就是查询的执行顺序,如果id值相同表示语句是自上而下的执行的

mysql优化----explain的列分析

sql语句优化: 1: sql语句的时间花在哪儿? 答: 等待时间 , 执行时间. 等待时间:看是不是被锁住了,那就不是语句层面了是服务端层面了,看连接数内存. 执行时间:到底取出多少行,一次性取出1万行那是你的sql语句写的失败,二是扫描多少行,扫描多少行需要技术来分析,通过explain来分析. 可以重构查询和切分查询. 2: sql语句的执行时间,又花在哪儿了? 答:a: 查 ----> 沿着索引查,甚至全表扫描b: 取 ----> 查到行后,把数据取出来(sending data) 3

MySQL优化Explain命令简介(二)

type列 MySQL手册上注明type列用于描述join type,不过我们认为把这一列视为对access type--即MySQL决定如何在表中寻找数据的方式的描述,更加合适一些,以下所示从最坏情况到最好情况下的access类型: ALL All类型即常说的全表扫描,通常意味着MySQL需要从头到尾扫描整张表以找到符合条件的行记录(使用LIMIT限定的查询语句个例外,一般在extra列中会有"Using distinct/not exists"的补充描述). index 基本和全表

mysql 优化 explain

select_type: select类型 1).SIMPLE(不使用UNION或子查询等) 2) .PRIMARY:最外层的select 3).DERIVED:派生表的SELECT(FROM子句的子查询) 4).UNION:UNION中的第二个或后面的SELECT语句 5).UNION RESULT:UNION的结果. 6).DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询 7).SUBQUERY:子查询中的第一个SELECT 8).DEPENDE

MySQL优化—工欲善其事,必先利其器之EXPLAIN

转自:http://www.cnblogs.com/magialmoon/archive/2013/11/23/3439042.html mysql官方手册关于explain命名的说明文档:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_select_type 最近慢慢接触MySQL,了解如何优化它也迫在眉睫了,话说工欲善其事,必先利其器.最近我就打算了解下几个优化MySQL中经常用到的工具.今天就简单介绍下

mysql优化(三)–explain分析sql语句执行效率

mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select … from … [where …] 例如:explain select * from

mysql优化命令:explain

原文地址:http://www.cnblogs.com/magialmoon/p/3439042.html#id 在园子里偶然看到这篇文章,感觉十分不错,全面,思路清晰,因为自己也一直想做一些常用命令的总结,就先拿过来用了,感谢原作者! 1.测试环境 2.explain介绍 2.1 id 2.2 select_type 2.3 table 2.4 type 2.5 possible_keys 2.6 key 2.7 key_len 2.8 ref 2.9 rows 2.10 Extra 3.总结

mysql优化学习备忘之 explain

explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: explain select surname,first_name form a,b where a.id=b.id EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型.从最好到最差的连接类型为const.eq_reg.ref.range.in