设计网站流程,磁力猫引擎入口,pc网站怎么做自适应,如何制作自己的网站什么是执行计划#xff1f;
执行计划 是指一条 SQL 语句在经过 MySQL 查询优化器 的优化会后#xff0c;具体的执行方式。
执行计划通常用于 SQL 性能分析、优化等场景。通过 EXPLAIN 的结果#xff0c;可以了解到如数据表的查询顺序、数据查询操作的操作类型、哪些索引可…什么是执行计划
执行计划 是指一条 SQL 语句在经过 MySQL 查询优化器 的优化会后具体的执行方式。
执行计划通常用于 SQL 性能分析、优化等场景。通过 EXPLAIN 的结果可以了解到如数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实际会命中、每个数据表有多少行记录被查询等信息。
如何获取执行计划
MySQL 为我们提供了 EXPLAIN 命令来获取执行计划的相关信息。
需要注意的是EXPLAIN 语句并不会真的去执行相关的语句而是通过查询优化器对语句进行分析找出最优的查询方案并显示对应的信息。
EXPLAIN 执行计划支持 SELECT、DELETE、INSERT、REPLACE 以及 UPDATE 语句。我们一般多用于分析 SELECT 查询语句使用起来非常简单语法如下
EXPLAIN SELECT 查询语句
我们简单来看下一条查询语句的执行计划
mysql EXPLAIN SELECT score,name FROM cus_order ORDER BY score DESC;
--------------------------------------------------------------------------------------------------------------------
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
--------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | cus_order | NULL | ALL | NULL | NULL | NULL | NULL | 997572 | 100.00 | Using filesort |
--------------------------------------------------------------------------------------------------------------------
1 row in set, 1 warning (0.00 sec)
各个字段的含义如下
列名含义idSELECT 查询的序列标识符select_typeSELECT 关键字对应的查询类型table用到的表名partitions匹配的分区对于未分区的表值为 NULLtype表的访问方法possible_keys可能用到的索引key实际用到的索引key_len所选索引的长度ref当使用索引等值查询时与索引作比较的列或常量rows预计要读取的行数filtered按表条件过滤后留存的记录数的百分比Extra附加信息
如何分析 EXPLAIN 结果
为了分析 EXPLAIN 语句的执行结果我们需要搞懂执行计划中的重要字段。
id
SELECT 标识符是查询中 SELECT 的序号用来标识整个查询中 SELELCT 语句的顺序。id 如果相同从上往下依次执行。id 不同id 值越大执行优先级越高如果行引用其他行的并集结果则该值可以为 NULL。
select_type
查询的类型主要用于区分普通查询、联合查询、子查询等复杂的查询常见的值有
SIMPLE简单查询不包含 UNION 或者子查询。PRIMARY查询中如果包含子查询或其他部分外层的 SELECT 将被标记为 PRIMARY。SUBQUERY子查询中的第一个 SELECT。UNION在 UNION 语句中UNION 之后出现的 SELECT。DERIVED在 FROM 中出现的子查询将被标记为 DERIVED。UNION RESULTUNION 查询的结果。
table
查询用到的表名每行都有对应的表名表名除了正常的表之外也可能是以下列出的值
unionM,N : 本行引用了 id 为 M 和 N 的行的 UNION 结果 : 本行引用了 id 为 N 的表所产生的的派生表结果。派生表有可能产生自 FROM 语句中的子查询。 : 本行引用了 id 为 N 的表所产生的的物化子查询结果。
type重要
查询执行的类型描述了查询是如何执行的。所有值的顺序从最优到最差排序为system const eq_ref ref fulltext ref_or_null index_merge unique_subquery index_subquery range index ALL
常见的几种类型具体含义如下
system如果表使用的引擎对于表行数统计是精确的如MyISAM且表中只有一行记录的情况下访问方法是 system 是 const 的一种特例。const表中最多只有一行匹配的记录一次查询就可以找到常用于使用主键或唯一索引的所有字段作为查询条件。eq_ref当连表查询时前一张表的行在当前这张表中只有一行与之对应。是除了 system 与 const 之外最好的 join 方式常用于使用主键或唯一索引的所有字段作为连表条件。ref使用普通索引作为查询条件查询结果可能找到多个符合条件的行。index_merge当查询条件使用了多个索引时表示开启了 Index Merge 优化此时执行计划中的 key 列列出了使用到的索引。range对索引列进行范围查询执行计划中的 key 列表示哪个索引被使用了。index查询遍历了整棵索引树与 ALL 类似只不过扫描的是索引而索引一般在内存中速度更快。ALL全表扫描。
possible_keyspossible_keys
列表示 MySQL 执行查询时可能用到的索引。如果这一列为 NULL 则表示没有可能用到的索引这种情况下需要检查 WHERE 语句中所使用的的列看是否可以通过给这些列中某个或多个添加索引的方法来提高查询性能。#
key重要
key 列表示 MySQL 实际使用到的索引。如果为 NULL则表示未用到索引
key_lenkey_len
列表示 MySQL 实际使用的索引的最大长度当使用到联合索引时有可能是多个列的长度和。在满足需求的前提下越短越好。如果 key 列显示 NULL 则 key_len 列也显示 NULL 。
rows
rows 列表示根据表统计信息及选用情况大致估算出找到所需的记录或所需读取的行数数值越小越好。
Extra重要
这列包含了 MySQL 解析查询的额外信息通过这些信息可以更准确的理解 MySQL 到底是如何执行查询的。常见的值如下
Using filesort在排序时使用了外部的索引排序没有用到表内索引进行排序。Using temporaryMySQL 需要创建临时表来存储查询的结果常见于 ORDER BY 和 GROUP BY。Using index表明查询使用了覆盖索引不用回表查询效率非常高。Using index condition表示查询优化器选择使用了索引条件下推这个特性。Using where表明查询使用了 WHERE 子句进行条件过滤。一般在没有使用到索引的时候会出现。Using join buffer (Block Nested Loop)连表查询的方式表示当被驱动表的没有使用索引的时候MySQL 会先将驱动表读出来放到 join buffer 中再遍历被驱动表与驱动表进行查询。
这里提醒下当 Extra 列包含 Using filesort 或 Using temporary 时MySQL 的性能可能会存在问题需要尽可能避免。#