一、explain 的使用
Explain 可以获取 MySQL 中 SQL 语句的执行计划,比如语句是否使用了关联查询、是否使用了索引、扫描行数等。可以帮我们选择更好地索引和写出更优的 SQL。使用方法:在 SQL 语句前面加上 explain 运行就可以了。
1 2 3 4 5 6
| mysql> explain select * from user where name = '6'; +----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+ | 1 | SIMPLE | user | NULL | ref | name_index | name_index | 363 | const | 1 | 100.00 | NULL | +----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
|
列名 |
描述 |
id |
在一个大的SQL语句中每个 select 关键字都对应一个唯一的 id |
select_type |
SQL语句类型 |
table |
表名 |
partitions |
匹配的分区信息 |
type |
针对单表的访问方法 |
possible_keys |
可能使用到的索引 |
key |
实际上使用的索引 |
key_len |
实际使用的索引长度 |
ref |
当使用索引列等值查询时,与索引列进行等值匹配的对象信息 |
rows |
预估需要读取的记录数 |
filtered |
某个表经过搜索条件过滤后剩余记录条数的百分比 |
Extra |
一些额外的信息 |
1. select_type 列一部分解释
select_type 的值 |
解释 |
SIMPLE |
简单查询(不使用关联查询或子查询) |
PRIMARY |
如果包含关联查询或者子查询,则最外层的查询部分标记为 primary |
UNION |
联合查询中第二个及后面的内容 |
2. type 列
type 的值 |
解释 |
system |
查询对象列只有一行数据,且只能用于 MyISAM 和 Memory 引擎的表,这是最好的情况 |
const |
基于主键或唯一索引查询,最多返回一条结果 |
eq_ref |
表连接时基于主键或非 NULL 的唯一索引完成扫描 |
ref |
基于普通索引的等值查询,或者表间等值连接 |
fulltext |
全文索引 |
ref_or_null |
表连接类型是 ref,但进行扫描的索引列中可能包含 NULL 值 |
index_merge |
利用多个索引 |
unique_subquery |
子查询中使用唯一索引 |
index_subquery |
子查询中使用普通索引 |
range |
利用索引进行范围查询 |
index |
全索引扫描 |
Extra 常见的值 |
解释 |
Using index |
使用覆盖索引 |
Using index condition |
先条件过滤索引,在查数据 |
Using where |
使用 where 语句来处理结果 |
Using temporary |
需要创建一个临时表来存储结构,通过发生对没有索引的列进行 Group By 时 |
Impossible where |
对 where 子句判断的结果总是 false 而不能选择任何数据 |
Using join buffer ( Block Nested Loop ) |
关联查询中,被驱动表的关联字段没有索引 |
Select tables optimized away |
使用某些聚合函数(比如 max、min)来访问存在索引的某个字段 |