如何解读MySQL执行计划的type列和extra列

发布时间:2021-11-03 11:03:10 作者:柒染
来源:亿速云 阅读:303

如何解读MySQL执行计划的type列和extra列

引言

在MySQL数据库性能优化过程中,执行计划(EXPLN)是一个非常重要的工具。通过分析执行计划,我们可以了解MySQL是如何执行查询的,从而找出潜在的性能瓶颈。执行计划中的type列和extra列提供了关于查询执行方式的关键信息。本文将深入探讨如何解读这两列,帮助读者更好地理解和优化MySQL查询。

1. 执行计划概述

1.1 什么是执行计划

执行计划是MySQL优化器生成的关于如何执行查询的详细计划。通过EXPLN命令,我们可以查看这个计划。执行计划包含了多个列,每列都提供了关于查询执行的不同方面的信息。

1.2 执行计划的主要列

执行计划的主要列包括:

本文将重点讨论type列和extra列。

2. 解读type

type列表示MySQL如何查找表中的行,它是执行计划中最重要的列之一。type列的值从最优到最差依次为:

2.1 system

systemtype列中最好的类型,表示表中只有一行数据。这种情况通常发生在查询系统表或只有一行数据的表时。

EXPLN SELECT * FROM (SELECT 1) AS t;

2.2 const

const表示通过主键或唯一索引查找一行数据。这种类型的查询非常高效,因为MySQL只需要查找一次。

EXPLN SELECT * FROM users WHERE id = 1;

2.3 eq_ref

eq_ref表示在连接查询中,MySQL使用主键或唯一索引来查找每一行。这种类型通常出现在多表连接查询中,且连接条件使用了主键或唯一索引。

EXPLN SELECT * FROM users u JOIN orders o ON u.id = o.user_id;

2.4 ref

ref表示MySQL使用非唯一索引来查找行。这种类型的查询比eq_ref稍差,但仍然比较高效。

EXPLN SELECT * FROM users WHERE email = 'example@example.com';

2.5 fulltext

fulltext表示MySQL使用全文索引来查找行。这种类型通常出现在使用MATCHAGNST的查询中。

EXPLN SELECT * FROM articles WHERE MATCH(title, content) AGNST('MySQL');

2.6 ref_or_null

ref_or_null表示MySQL使用非唯一索引来查找行,并且还查找NULL值。这种类型通常出现在包含IS NULL条件的查询中。

EXPLN SELECT * FROM users WHERE email = 'example@example.com' OR email IS NULL;

2.7 index_merge

index_merge表示MySQL使用了索引合并优化。这种类型通常出现在查询条件中使用了多个索引的情况下。

EXPLN SELECT * FROM users WHERE id = 1 OR email = 'example@example.com';

2.8 unique_subquery

unique_subquery表示MySQL在子查询中使用了唯一索引。这种类型通常出现在IN子查询中。

EXPLN SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);

2.9 index_subquery

index_subquery表示MySQL在子查询中使用了非唯一索引。这种类型与unique_subquery类似,但使用的是非唯一索引。

EXPLN SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);

2.10 range

range表示MySQL使用索引来查找一定范围内的行。这种类型通常出现在使用BETWEENIN><等条件的查询中。

EXPLN SELECT * FROM users WHERE id BETWEEN 1 AND 10;

2.11 index

index表示MySQL扫描整个索引来查找行。这种类型通常出现在查询条件中没有使用索引的情况下。

EXPLN SELECT * FROM users ORDER BY id;

2.12 ALL

ALL表示MySQL扫描整个表来查找行。这种类型是最差的,通常出现在没有使用索引的情况下。

EXPLN SELECT * FROM users WHERE name = 'John';

3. 解读extra

extra列提供了关于查询执行的额外信息。这些信息可以帮助我们更好地理解查询的执行方式。常见的extra列值包括:

3.1 Using index

Using index表示MySQL使用了覆盖索引(Covering Index),即查询的所有列都包含在索引中。这种情况下,MySQL不需要访问表数据,直接从索引中获取数据。

EXPLN SELECT id FROM users WHERE id = 1;

3.2 Using where

Using where表示MySQL在存储引擎检索行后,还需要在服务器层进行过滤。这种情况通常出现在查询条件中使用了非索引列的情况下。

EXPLN SELECT * FROM users WHERE name = 'John';

3.3 Using temporary

Using temporary表示MySQL需要创建一个临时表来处理查询。这种情况通常出现在GROUP BYDISTINCT查询中。

EXPLN SELECT DISTINCT name FROM users;

3.4 Using filesort

Using filesort表示MySQL需要对结果进行排序。这种情况通常出现在ORDER BY查询中,且没有使用索引进行排序的情况下。

EXPLN SELECT * FROM users ORDER BY name;

3.5 Using join buffer

Using join buffer表示MySQL使用了连接缓冲区来优化连接查询。这种情况通常出现在连接查询中,且连接条件没有使用索引的情况下。

EXPLN SELECT * FROM users u JOIN orders o ON u.id = o.user_id;

3.6 Distinct

Distinct表示MySQL在处理DISTINCT查询时,使用了优化策略。

EXPLN SELECT DISTINCT name FROM users;

3.7 Impossible WHERE

Impossible WHERE表示查询条件永远不可能为真,MySQL不会执行查询。

EXPLN SELECT * FROM users WHERE 1 = 0;

3.8 Select tables optimized away

Select tables optimized away表示MySQL优化器已经优化掉了查询中的表,查询不需要访问表数据。

EXPLN SELECT COUNT(*) FROM users;

4. 实际案例分析

4.1 案例1:简单查询

EXPLN SELECT * FROM users WHERE id = 1;

分析:MySQL通过主键查找一行数据,使用了覆盖索引。

4.2 案例2:范围查询

EXPLN SELECT * FROM users WHERE id BETWEEN 1 AND 10;

分析:MySQL使用主键索引查找一定范围内的行,并在服务器层进行过滤。

4.3 案例3:连接查询

EXPLN SELECT * FROM users u JOIN orders o ON u.id = o.user_id;

分析:MySQL通过主键查找每一行数据,使用了覆盖索引。

4.4 案例4:排序查询

EXPLN SELECT * FROM users ORDER BY name;

分析:MySQL扫描整个表,并对结果进行排序。

5. 总结

通过分析执行计划中的type列和extra列,我们可以深入了解MySQL如何执行查询,并找出潜在的性能瓶颈。type列告诉我们MySQL如何查找表中的行,而extra列提供了关于查询执行的额外信息。掌握这些信息,可以帮助我们更好地优化MySQL查询,提高数据库性能。

在实际应用中,我们应该尽量避免ALL类型的查询,尽量使用索引来优化查询。同时,关注extra列中的信息,避免使用临时表和文件排序等影响性能的操作。通过不断优化查询,我们可以显著提高MySQL数据库的性能和响应速度。

推荐阅读:
  1. SQL 增加列、修改列、删除列
  2. mysql执行计划详细解读

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql type extra

上一篇:java抽象类与接口有什么用

下一篇:idea安装本地插件的步骤是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》