mysql中怎么查看执行计划
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的执行计划可以帮助开发人员查看查询的执行过程,查找
