EXPLAIN语句可以用于查询SELECT、DELETE、INSERT和REPLACE语句的执行计划。语法如下:
EXPLAIN [EXTENDED | PARTITIONS] SELECT ...
其中,EXTENDED和PARTITIONS是可选参数。EXTENDED参数可以显示更详细的信息,包括扫描的行数和每个连接的信息。PARTITIONS参数可以显示关于分区的更多信息。
执行EXPLAIN语句后,会输出查询的执行计划,包括以下信息:
- id:查询的唯一标识符,同时是表的执行顺序。
- select_type:查询的类型,包括简单的SELECT查询、联合查询、子查询等。
- table:查询涉及的表名。
- type:使用的连接类型,一般是ALL、index、range、ref、eq_ref、const等。
- possible_keys:可能使用的索引。
- key:实际使用的索引。
- key_len:实际使用索引的长度。
- ref:使用索引的列或常数。
- rows:扫描的行数。
- Extra:额外的信息。
其中,type、possible_keys和key是查询索引使用情况的关键参数。
type:
type表示查询时使用的连接类型,MySQL中常见的连接类型有:
ALL:无索引扫描,全表扫描;
index:仅扫描索引;
range:使用索引范围扫描;
ref:使用非唯一索引扫描;
eq_ref:使用唯一索引扫描;
const/system:从表的一行读取数据,查询只会返回一行,不需要扫描任何索引。
possible_keys和key:
possible_keys表示可以使用的索引,而key表示实际使用的索引。如果possible_keys和key相同,则说明查询使用了正确的索引;如果不同,则需要进一步优化查询。
例如,有一个名称为user的表,有id、name、age三个字段,其中id为主键,可以设置索引。执行以下查询:
EXPLAIN SELECT * FROM user WHERE name='Tom' AND age=20;
执行结果如下:
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE user ref name_age name_age 3 const 1 Using index condition
可以看到,type为ref,表示使用了非唯一索引扫描;possible_keys包括name_age(name和age的联合索引),key为name_age,说明实际使用了联合索引。
通过分析上述信息,可以进一步优化查询语句,以提高查询效率。