博客
关于我
Mysql执行计划字段解释
阅读量:798 次
发布时间:2023-02-12

本文共 4295 字,大约阅读时间需要 14 分钟。

MySQL 执行计划详解:理解执行计划字段与优化

一、前言

在 SQL 优化工作中,查看执行计划(Execution Plan)是必不可少的操作。但每次查看执行计划时,字段含义总是让人感到困惑。为了解决这个问题,我们可以参考以下文章,帮助快速掌握执行计划的字段含义及其意义。


二、如何查看执行计划

在 MySQL 中查看执行计划可以通过以下几种方式:

  • 在 SELECT 语句前添加 EXPLAIN 关键字

    例如:

    EXPLAIN SELECT * FROM user;

    执行后,MySQL 会返回一个详细的执行计划。

  • 使用 Navicat 等数据库工具

    在工具中点击数据库表的“解释”按钮,MySQL 会自动生成执行计划。


  • 三、执行计划字段解释

    执行计划是 MySQL 提供的性能优化工具,它通过展示数据库如何处理 SELECT 语句,可以帮助我们分析查询性能。以下是执行计划中常见字段的解释:

    1. id

    • 说明:操作的唯一标识符。

    2. select_type

    • 说明:操作的类型,例如:
      • SIMPLE:简单查询。
      • PRIMARY:主查询(外部查询)。
      • SUBQUERY:子查询。
      • DEPENDENT SUBQUERY:依赖子查询。
      • UNCACHEABLE SUBQUERY:不可缓存子查询。
      • UNION:合并查询。
      • UNION RESULT:合并查询结果。
      • DEPENDENT UNION:依赖合并查询。
      • UNCACHEABLE UNION:不可缓存合并查询。
      • DERIVED:派生表。
      • MATERIALIZED:物化查询。

    3. table

    • 说明:涉及的表名。

    4. partitions

    • 说明:操作涉及的分区。

    5. type

    • 说明:表示使用的连接类型或扫描类型。性能从优到劣依次为:
      system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

    6. possible_keys

    • 说明:可能使用的索引列表。

    7. key

    • 说明:实际选择使用的索引。

    8. key_len

    • 说明:索引键的长度。

    9. ref

    • 说明:连接条件所使用的列或常量。

    10. rows

    • 说明:估计的扫描行数。

    11. filtered

    • 说明:从结果中过滤返回行的百分比。

    12. Extra

    • 说明:额外的信息,包括索引下推、临时表等。

    四、select_type 详解

    4.1 SIMPLE(简单查询)

    • 说明:不包含 UNION 或子查询的查询。

    4.1.1 简单的单表查询

    EXPLAIN SELECT * FROM user;

    4.1.2 多表连接查询

    EXPLAIN SELECT a.*, b.* FROM user aINNER JOIN dept b ON b.id = a.dept_id;

    4.2 PRIMARY(主查询)

    • 说明:包含复杂子查询的外层查询,或者 UNION 语句中的第一个查询。

    4.2.1 包含复杂子查询的外层查询

    EXPLAIN SELECT * FROM (SELECT * FROM user WHERE id = 1 UNION ALL SELECT * FROM user WHERE id = 2) x;

    4.2.2 UNION 语句中的第一个查询

    EXPLAIN SELECT * FROM user WHERE id = 1 UNION ALL SELECT * FROM user WHERE id = 2;

    4.3 SUBQUERY、DEPENDENT SUBQUERY、UNCACHEABLE SUBQUERY

    • 说明:子查询类型及其特点:
      • SUBQUERY:子查询。
      • DEPENDENT SUBQUERY:依赖子查询。
      • UNCACHEABLE SUBQUERY:不可缓存子查询。

    4.3.1 SUBQUERY(子查询)

    例如:

    EXPLAIN SELECT * FROM user WHERE age > (SELECT avg(age) FROM user);

    4.3.2 DEPENDENT SUBQUERY(依赖子查询)

    例如:

    EXPLAIN SELECT * FROM user WHERE age IN (SELECT avg(age) FROM user);

    4.3.3 UNCACHEABLE SUBQUERY(不可缓存子查询)

    例如:

    EXPLAIN SELECT (SELECT id FROM user ORDER BY RAND() LIMIT 1) AS random_user FROM dual;

    4.4 UNION、UNION RESULT、DEPENDENT UNION、UNCACHEABLE UNION

    • 说明:UNION 语句及其子类型特点。

    4.4.1 UNION(合并查询)、UNION RESULT(合并查询结果)

    例如:

    EXPLAIN SELECT * FROM user WHERE id = 1 UNION SELECT * FROM user WHERE id = 2;

    4.4.2 DEPENDENT UNION(依赖合并查询)

    例如:

    EXPLAIN SELECT * FROM user WHERE id IN (SELECT id FROM user WHERE name = '张三' UNION ALL SELECT id FROM user WHERE name = '李四');

    4.4.3 UNCACHEABLE UNION(不可缓存合并查询)

    例如:

    EXPLAIN SELECT * FROM user WHERE id IN (SELECT id FROM user WHERE name = '张三' UNION SELECT id FROM user WHERE name > '张三' ORDER BY RAND());

    4.5 DERIVED(派生表)

    • 说明:在查询中使用子查询生成的临时表。

    例如:

    EXPLAIN SELECT u.dept_id, u.avgAge FROM (SELECT dept_id, avg(age) avgAge FROM user WHERE id > 3 GROUP BY dept_id) AS u WHERE u.avgAge > 20;

    4.6 MATERIALIZED(物化)

    • 说明:当查询包含子查询或派生表时,优化器会将结果保存到临时表中以提高性能。

    五、type 详解

    5.1 system

    • 说明:该表只有一行(相当于系统表)。

    5.2 const

    • 说明:键或唯一索引的等值查询。

    例如:

    EXPLAIN SELECT * FROM user WHERE id = 1;

    5.3 eq_ref

    • 说明:使用了索引的全部组成部分,并且索引是 PRIMARY KEY 或 UNIQUE NOT NULL。

    例如:

    EXPLAIN SELECT u.*, d.* FROM user u INNER JOIN dept d ON d.id = u.dept_id WHERE u.name = '张三';

    5.4 ref

    • 说明:仅使用了索引的最左边前缀,或者索引不是 PRIMARY KEY 或 UNIQUE。

    例如:

    EXPLAIN SELECT * FROM user WHERE name = '张三';

    5.5 fulltext

    • 说明:全文索引。

    例如:

    EXPLAIN SELECT * FROM user WHERE MATCH (remark) AGAINST ('c*' IN BOOLEAN MODE);

    5.6 ref_or_null

    • 说明:和 ref 类似,但会额外搜索哪些行包含了 NULL。

    例如:

    EXPLAIN SELECT * FROM user WHERE name = '张三' OR name IS NULL;

    5.7 index_merge

    • 说明:使用索引合并优化。

    例如:

    EXPLAIN SELECT * FROM user WHERE id = '1' OR name = '张三';

    5.8 unique_subquery

    • 说明:和 eq_ref 类似,但使用了 IN 查询,且子查询是主键或唯一索引。

    5.9 index_subquery

    • 说明:和 unique_subquery 类似,只是子查询使用的是非唯一索引。

    5.10 range

    • 说明:仅检索给定范围内的行,使用索引来选择行。

    例如:

    EXPLAIN SELECT * FROM user WHERE id > 5;

    5.11 index

    • 说明:与 ALL 类似,只是扫描了索引树。

    5.12 ALL

    • 说明:全表扫描。

    六、Extra

    6.1 Using index

    • 说明:查询使用了覆盖索引。

    例如:

    EXPLAIN SELECT id FROM user WHERE id = 1;

    6.2 Using where

    • 说明:在执行查询时会使用 WHERE 子句对结果进行进一步的筛选。

    例如:

    EXPLAIN SELECT * FROM user WHERE age > 18;

    6.3 Using temporary

    • 说明:MySQL 需要创建一个临时表来保存结果。

    例如:

    EXPLAIN SELECT name FROM user WHERE id = 1 UNION SELECT name FROM user WHERE id = 2;

    6.4 Using filesort

    • 说明:无法使用索引或其他优化方式直接按照查询语句中的顺序返回结果,需要额外的排序操作。

    例如:

    EXPLAIN SELECT * FROM user ORDER BY age LIMIT 10;

    6.5 Using index condition

    • 说明:表示查询使用了索引条件过滤数据。

    例如:

    EXPLAIN SELECT * FROM user WHERE name = '张三' AND age > 18;

    通过以上内容,我们可以更清晰地理解 MySQL 执行计划的字段含义及其对查询性能的影响,从而更有效地进行 SQL 优化。

    转载地址:http://bbdfk.baihongyu.com/

    你可能感兴趣的文章
    MySQL锁机制
    查看>>
    mysql锁机制,主从复制
    查看>>
    Mysql锁机制,行锁表锁
    查看>>
    MySQL锁表问题排查
    查看>>
    Mysql锁(1):锁概述和全局锁的介绍
    查看>>
    Mysql锁(2):表级锁
    查看>>
    MySQL锁,锁的到底是什么?
    查看>>
    MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
    查看>>
    Mysql错误2003 -Can't connect toMySQL server on 'localhost'(10061)解决办法
    查看>>
    MySQL错误提示mysql Statement violates GTID consistency
    查看>>
    mysql错误:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
    查看>>
    mysql长事务
    查看>>
    mysql问题记录
    查看>>
    mysql间隙锁
    查看>>
    MySQL集群解决方案(1):MySQL数据库的集群方案
    查看>>
    MySQL集群解决方案(2):主从复制架构
    查看>>
    MySQL集群解决方案(4):负载均衡
    查看>>
    MySQL集群解决方案(5):PXC集群
    查看>>
    MySQL面试宝典
    查看>>
    WAP短信:融合传统短信和互联网的新型通信方式
    查看>>