欢迎访问宙启技术站
智能推送

mysql中怎么查看执行计划

发布时间:2023-05-17 10:48:34

MySQL是一种开源的关系型数据库管理系统(RDBMS),广泛用于Web应用程序和大型企业级数据库系统。随着数据规模的增长,查询性能也变得更加重要。为了优化查询性能,MySQL提供了执行计划(EXPLAIN)工具。执行计划工具可以解析查询语句并分析其查询过程,显示优化器如何处理查询语句,并提供有关数据访问方法的详细信息。在这篇文章中,我们将介绍MySQL中如何查看执行计划。

一、基本概念

在MySQL中,执行计划是一个解释器,它可以分析查询语句并确定如何最有效地执行查询。它产生的输出称为执行计划(query plan)或Explain计划。

执行计划会告诉你查询的数据来源、连接类型、索引使用情况和每个表的访问方式等信息。通过查询执行计划,你可以找出哪些查询造成了数据库性能问题。

二、使用EXPLAIN

我们使用EXPLAIN关键字来查看MySQL的执行计划。EXPLAIN会将查询解析并显示有关它的执行计划的信息。在查询之前添加关键字EXPLAIN,然后查询的执行计划将会显示。

下面是一个简单的查询使用EXPLAIN的例子:

EXPLAIN SELECT * FROM customers WHERE id=1;

查询执行计划将显示为:

+----+-------------+-----------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref   | rows | Extra       |
+----+-------------+-----------+------+---------------+------+---------+-------+------+-------------+
|  1 | SIMPLE      | customers | ALL  | NULL          | NULL | NULL    | NULL  |    1 | Using where |
+----+-------------+-----------+------+---------------+------+---------+-------+------+-------------+

查询执行计划解释如下:

- id - 表示每个SELECT子句的 标识符。

- select_type - 查询的类型。

- table - 表示查询的目标表。

- type - 表示使用的连接类型。

- possible_keys - 可能使用的索引列表。

- key - 实际使用的索引。

- key_len - 使用的索引的长度。

- ref - 列或常量所引用的列。

- rows - 表示在执行查询时扫描的行数。

- Extra - 附加信息。

执行计划中的每行表示查询中的一个SELECT子句。如果查询中有多个SELECT子句,则会为每个SELECT子句分配一个 的id。

查询类型(select_type)可以是以下之一:

- SIMPLE - 查询不包含子查询或UNION。

- PRIMARY - 查询最外层的查询。

- UNION - 查询是UNION的第二个或后续的查询。

- DEPENDENT UNION - UNION查询中的子查询,依赖于外部查询。

- SUBQUERY - 查询是子查询中的 个查询。

- DEPENDENT SUBQUERY - 子查询依赖于外部查询。

- DERIVED - 从FROM子句的结果派生的查询。

- UNCACHEABLE SUBQUERY - 查询不能被缓存的子查询。

- UNCACHABLE UNION - 不能缓存的UNION查询中的第二个或后续子查询。

连接类型(type)可以是以下之一:

- ALL - 全表扫描。

- index - 索引扫描。

- range - 索引范围扫描。

- ref - 基于某个 索引进行的查找。

- eq_ref - 基于PRIMARY或UNIQUE索引进行的查找。

- const - 对于PRIMARY KEY或UNIQUE索引查找单行。

- system - 表中只有一行的查询。

- NULL - 无查询使用连接类型。

3、Extra列

执行计划中的EXTRA列包括有关查询的额外信息:

- Using filesort:表示MySQL需要执行排序操作(如ORDER BY)但是不能使用索引排序,因此需要使用临时文件进行排序操作。

- Using temporary:表示MySQL需要为查询创建临时表,以便能够执行排序或分组等操作。

- Using index:表示查询使用了当前语句中的相关索引,而不是全表扫描。

- Using where:表示MySQL需要根据WHERE子句中的条件在存储引擎层进行过滤。

- Using join buffer:表示在处理JOIN时,MySQL使用了缓冲区。

- Impossible WHERE:表示查询的WHERE子句永远为false。

- Select tables optimized away:表示查询仅使用了索引(not indexed column)并且未读取表中任何行。

- No tables used:表示查询并未引用任何表,例如SELECT 1+2。

- distinct:表示需要消除重复行。

- fulltext:表示全文搜索优化。

- dependant subquery:表示子查询是依赖于外部查询结果的。

- defererd:表示在空闲时执行查询。

4、使用优化器操作执行计划

执行计划提供的信息可以帮助我们优化查询性能。通过查询执行计划,可以查看查询使用了哪些索引以及如何使用这些索引。优化查询,可以使用以下技巧:

- 使用索引:索引是加快MySQL查询性能的核心组件。尝试使用索引来加快查询。使用索引可以减少读取大量数据的次数,提高查询速度。

- 增加索引覆盖:索引覆盖是指查询在索引中找到所有需要的数据,而不必访问表中的行。尽可能增加索引覆盖,可以减少磁盘I/O的数量,并提高查询性能。

- 避免全表扫描:避免读取整个表,如果没有必要,尽可能避免使用全表扫描。

- 使用SQL优化器:SQL优化器是一个数据库执行计划的关键组件,它可以自动优化查询。它可以自动重新排列查询语句,使其更有效。

5、具体案例

对于一个查询的分析,我们通常需要查看如下信息:

- 查询的目标表名称:在查询中涉及的MySQL表。

- 使用的索引名称:在查询中使用的索引名称。

- 扫描的行数:在执行查询时扫描的行数。

- 需要使用的缓存大小:在处理查询期间需要使用的缓存空间大小。

- 排序状态:是否需要将结果集排序。

下面是查询执行计划的分析:

我们考虑以下查询:

SELECT t1.col1, t2.col2 FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t1.key=t2.key
WHERE t1.col3='value'
ORDER BY t2.col4 DESC

可以通过分析执行计划获取如下信息:

- 查询中涉及的表:table1和table2。

- 字段列表:t1.col1和t2.col2。

- 连接类型:LEFT OUTER JOIN。

- 使用的索引:索引key用于JOIN,索引col3和col4用于WHERE和ORDER BY。

- 处理行数:从table1和table2中读取的行数。

- 需要使用的缓存大小:使用的缓存空间的大小。

- 排序状态:是否排序,以及排序的方式(DESC)。

通过执行计划的分析,我们可以发现查询中存在一些性能问题,例如需要使用全表扫描的查询、过多的关联和大量的排序。优化这些问题需要使用索引、更好的查询和优化器的选择。

总结

MySQL的执行计划可以帮助开发人员查看查询的执行过程,查找