一、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)来访问存在索引的某个字段 |