博客
关于我
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更新锁(for update)摘要
    查看>>
    mysql替换表的字段里面内容
    查看>>
    MySQL有哪些锁
    查看>>
    MySQL服务器安装(Linux)
    查看>>
    mysql服务器查询慢原因分析方法
    查看>>
    mysql服务无法启动的问题
    查看>>
    MySQL杂谈
    查看>>
    mysql权限
    查看>>
    mysql条件查询
    查看>>
    MySQL架构与SQL的执行流程_1
    查看>>
    MySQL架构与SQL的执行流程_2
    查看>>
    MySQL架构介绍
    查看>>
    MySQL架构优化
    查看>>
    MySQL查看数据库相关信息
    查看>>
    MySQL查看表结构和表中数据
    查看>>
    MySQL查询优化:LIMIT 1避免全表扫描
    查看>>
    MySQL查询优化之索引
    查看>>
    mysql查询储存过程,函数,触发过程
    查看>>