Mysql explain分析sql语句执行效率
程序员文章站
2022-03-09 14:09:37
mysql优化–explain分析sql语句执行效率 Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。 Explain语法:explain ......
mysql优化–explain分析sql语句执行效率
explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,explain可以用来查看sql语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。
explain语法:explain select … from … [where …]
例如:
explain select * from news where id = 1;
输出:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |
---|---|---|---|---|---|---|---|---|---|
1 | simple | news | const | primary | primary | 4 | const | 1 |
对各个属性进行了解:
id:这是select的查询序列号。
select_type:select_type就是select的类型,可以有以下几种:
simple:简单select(不使用union或子查询等) primary:最外面的select union:union中的第二个或后面的select语句 dependent union:union中的第二个或后面的select语句,取决于外面的查询 union result:union的结果。 subquery:子查询中的第一个select dependent subquery:子查询中的第一个select,取决于外面的查询 derived:导出表的select(from子句的子查询)
- table:显示这一行的数据是关于哪张表的。
- type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用explain命令分析性能瓶颈的关键项之一。
结果值从好到坏依次是: system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all 也就是说 type 记录了是否使用了索引还是全表扫描,const, eg_reg, ref, range, index, all 一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
- possible_keys:指出了mysql能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。
- key:显示mysql实际决定使用的键(索引)。如果没有选择索引,键是null。
- key_len:显示mysql决定使用的键长度。如果键是null,则长度为null。使用的索引的长度。在不损失精确性的情况下,长度越短越好。
- ref:显示使用哪个列或常数与key一起从表中选择行。
- rows:显示mysql认为它执行查询时必须检查的行数。
- wxtra:包含mysql解决查询的详细信息,也是关键参考项之一,显示了查询中mysql的附加信息,关注 using filesort 和 using temporary。
distinct 一旦mysql找到了与行相联合匹配的行,就不再搜索了 not exists mysql 优化了left join,一旦它找到了匹配left join标准的行, 就不再搜索了 range checked for each record(index map:#) 没有找到理想的索引,因此对于从前面表中来的每一 个行组合,mysql检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一 using filesort 看 到这个的时候,查询就需要优化了。mysql需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来 排序全部行 using index 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表 的全部的请求列都是同一个索引的部分的时候 using temporary 看到这个的时候,查询需要优化了。这 里,mysql需要创建一个临时表来存储结果,这通常发生在对不同的列集进行order by上,而不是group by上 using where 使用了where从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型all或index, 这就会发生,或者是查询有问题
当 type 显示为 “index” 时,并且extra显示为“using index”, 表明使用了覆盖索引。
推荐阅读
-
MySQL中通过EXPLAIN如何分析SQL的执行计划详解
-
oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
-
MySQL利用profile分析慢sql详解(group left join效率高于子查询)
-
mysql 显示SQL语句执行时间的代码
-
explain分析sql效率的方法
-
Shell脚本中执行sql语句操作mysql的5种方法
-
MySQL SQL语句分析与查询优化详解
-
php与mysql建立连接并执行SQL语句的代码
-
Mybaits 源码解析 (六)----- 全网最详细:Select 语句的执行过程分析(上篇)(Mapper方法是如何调用到XML中的SQL的?)
-
MySQL中通过EXPLAIN如何分析SQL的执行计划详解