一、执行计划概述
在介绍SQL执行计划之前,我们需要先明确什么是SQL执行计划。SQL执行计划是指SQL语句执行时数据库系统为其生成的一个操作步骤列表,该列表记录了SQL语句如何通过索引、表扫描等方式访问数据库表,以及如何使用连接方式、排序等逻辑操作。
SQL执行计划非常重要,因为执行计划可以帮助我们理解SQL语句的执行过程,以及优化SQL语句的性能。
二、查看执行计划
了解SQL执行计划后,我们需要知道如何查看SQL执行计划。在MySQL数据库中,我们可以使用EXPLAIN关键字来查看执行计划。
EXPLAIN SELECT * FROM employees WHERE first_name='John';
上述SQL查询语句中,我们使用EXPLAIN关键字来查看该查询语句的执行计划。执行结果将会返回如下信息:
id: 1 select_type: SIMPLE table: employees partitions: NULL type: ref possible_keys: first_name key: first_name key_len: 13 ref: const rows: 2 Extra: Using index
从上面的执行结果可以看出,该查询语句的执行计划是使用索引,其中索引的键名为first_name,该索引可以有效地过滤出符合条件的2条数据。
三、执行计划详解
1. id
id是执行计划中每个操作步骤的标识符,MySQL会按照从小到大的顺序为每个操作步骤分配一个唯一的id。
例如,上面示例中的查询操作有一个id为1。
2. select_type
select_type表示操作类型,MySQL中查询操作的select_type可能有以下几种:
- SIMPLE:简单SELECT查询,不包含子查询或UNION操作
- PRIMARY:外层查询
- SUBQUERY:子查询
- DERIVED:导出表的子查询
- UNION:UNION操作的第二个或后面的查询操作
- UNION RESULT:UNION操作的结果
例如,上面示例中的查询操作的select_type为SIMPLE。
3. table
table表示操作的数据表名。
例如,上面示例中的查询操作访问的是employees表。
4. partitions
partitions表示操作分区表的分区名。
例如,如果查询操作访问的是一个分区表,则该字段会显示所访问的分区名。
5. type
type表示查询操作的访问方式,MySQL中查询操作的type可能有以下几种:
- ALL:全表扫描,该操作不使用索引或切忌使用索引
- index:索引扫描,该操作使用了覆盖索引,例如SELECT column1,column2 FROM table WHERE column1='value',其中column1为索引列。
- range:范围扫描,该操作使用了表中的一个区间,例如SELECT * FROM table WHERE column1 BETWEEN 1 and 'value'。
- ref:基于索引的等值匹配,该操作使用了非唯一或唯一的索引来匹配单行数据,例如SELECT * FROM table WHERE column1='value',其中column1为索引列。
- eq_ref:基于索引的等值联接,该操作与ref相似,但是在连接操作时使用的是唯一索引,例如SELECT * FROM table1 JOIN table2 ON table1.column1=table2.column1,其中column1为唯一索引列。
- const:基于常量的查询,该操作使用了常量表达式,例如SELECT * FROM table WHERE column1='value',其中'value'为常量。
- system:基于系统的查询,此时MySQL只有一行访问数据,例如内部的mysql这个数据库查询操作也可能出现system类型的行为操作。
例如,上面示例中的查询操作的type为ref。
6. possible_keys
possible_keys表示MySQL可以使用哪些索引来执行查询操作。
例如,如果一个查询操作查询的列在多个索引中都有出现,那么possible_keys字段会显示这些索引。
7. key
key表示MySQL实际使用的索引名。
例如,上面示例中的查询操作使用的是名为first_name的索引。
8. key_len
key_len表示MySQL在执行查询操作时使用的索引长度。
例如,上面示例中的查询操作使用的索引长度为13。
9. ref
ref表示MySQL在执行查询操作时使用的索引列。
例如,上面示例中的查询操作使用的索引列为const。
10. rows
rows表示MySQL执行查询操作时估计需要扫描的行数。该值并不一定正确,但可以帮助我们了解查询操作的性能瓶颈。
例如,上面示例中的查询操作估计需要扫描的行数为2。
11. Extra
Extra表示查询操作的额外信息,可能包括如下几种:
- Using index:表示MySQL使用了覆盖索引。在查询操作中,如果所有需要查询的列都在一个索引中出现,那么MySQL可以直接使用该索引进行查询操作,避免了查询操作必须要访问数据表的缺陷,大大提高查询性能。
- Using where:表示MySQL在查询操作中使用了WHERE子句中的筛选条件
- Using temporary:表示MySQL在查询操作中需要使用临时表来处理查询结果。在查询操作中,如果需要进行排序、排序需要使用到filesort算法,则MySQL需要使用临时表。
- Using filesort:表示MySQL在查询操作中使用了文件排序算法进行数据排序。在查询操作中,如果需要进行排序、排序没有使用到覆盖索引,则MySQL需要使用文件排序算法。
- Using join buffer:表示MySQL在查询操作中使用了连接缓存。
例如,上面示例中的查询操作的Extra为Using index。
四、总结
通过以上对SQL执行计划的详解,我们可以了解到SQL执行计划在数据库查询优化中的重要性,同时也能够清楚地了解如何查看和解释SQL执行计划的信息,以及如何根据SQL执行计划来进行优化SQL查询语句的性能。让我们在实际使用SQL查询语句的过程中,更加灵活地使用SQL执行计划,提升SQL查询操作的性能。