什么是explain
explain可以模拟优化器执行sql查询语句,知道mysql是如何处理查询语句,分析查询语句或者表结构性能瓶颈。
用法:
explain +sql
各字段解释:
explain select * from user;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | user | ALL | NULL | NULL | NULL | NULL | 1 | |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
- id:select查询序列号包含一组数字,表示查询中执行select子句或操作表的顺序
- id相同执行顺序由上至下
- id不同(主查询子查询)id越大越优先执行
- id相同又不同先执行数字大的,再顺序由上往下执行
- select_type查询类型
- simple简单查询,查询中不包含子查询或者union
- primary最外层的查询,内层包含任何复杂的子查询,最后执行
- subquery在select或者where列表中包含了子查询
- derived衍生from列表包含子查询mysql会递归这些子查询把他放在临时表
- union select前面是union则此select标记为union,from一个子查询这个子查询包含union则标记为union
- union result从union表获取select
- table 表名
- type 访问类型(下面顺序从最好到最差)
- system只有一条记录的表,平时不会出现,可以忽略
- const通过索引一次找到。常用于查找where后面的条件是primarykey或者unique索引
- eq_ref主键或者唯一索引扫描,只匹配到一条记录。常用于join on的连接条件中
- ref查找和扫描的混合体,也就是ref=const+eq_ref
- range检索给定范围的行,使用一个索引来选择,key代表用的是什么索引。常用于in后面接索引字段
- index全索引扫描,索引加载在内存速度快比all在磁盘扫描快
- all全表扫描
- possible_keys 显示可能用到的索引,可能有多个。
- key 实际使用的索引
- key_len 表示索引中使用的字节数,在不损失精度的情况下越短越好,查询条件越多索引长度越大
- ref 显示索引的哪一列被使用
- rows 根据表统计信息及索引使用情况,大致估算出找到最终结果需要查询多少行数据,越小越好。
- Extra 包含不适合在其他列中显示但十分重要的额外信息
- using filesort 未使用索引排序,mysql自己用文件排序。消耗严重需优化已经九死一生。
- using temporary 使用了临时表保存中间结果并排序,常见于order by 或者group by 十死无生。
- using index 这个厉害意思是说数据只从索引中拿,也就是select id from user;id是主键索引,可以理解覆盖索引,要查的数据刚好等于索引数据。同时出现using where表示索引也用来查找值select id from user where id = 1;不出现则表示只是扫描数据。
- using where 使用了where条件
- using join buffer 使用了连接缓存
- impossible where 使用了错乱的where比如select id from user where id =1 and id =2;id只能等于一个。
mysql> explain select id from user where id =1 and id =2 ; +----+-------------+-------+------+---------------+------+---------+------+------+------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+------------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE | +----+-------------+-------+------+---------------+------+---------+------+------+------------------+ 1 row in set (0.00 sec)
- select tables optimized away
- distinct