六、mysql优化-explain执行计划

本文详细介绍了MySQL中EXPLAIN语句的使用方法及其输出结果的字段含义,包括查询类型、表名、访问类型等,帮助读者理解SQL执行过程,优化查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

       

    7. select tables optimized away
    8. distinct

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值