加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL EXPLAIN结果集分析 - 附带大量案例

发布时间:2019-09-18 03:54:55 所属栏目:MySql教程 来源:佚名
导读:EXPLAIN:查看SQL语句的执行计划 EXPLAIN命令可以帮助我们深入了解MySQL基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用,在优化慢查询时非常有用。 执行explain之后结果集包含如下

当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range

  1. mysql> explain select * from test where bnet_id > 1000 and  bnet_id < 10000; 
  2. +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------+ 
  3. | id | select_type | table | type  | possible_keys | key      | key_len | ref  | rows | Extra                 | 
  4. +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------+ 
  5. |  1 | SIMPLE      | test  | range | idx_bnet      | idx_bnet | 9       | NULL |    1 | Using index condition | 
  6. +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------+ 

前提条件为bnet_id列有索引

index: 在进行统计时非常常见,此联接类型实际上会扫描索引树

  1. mysql> explain select count(*) from test; 
  2. +----+-------------+-------+-------+---------------+----------+---------+------+-------+-------------+ 
  3. | id | select_type | table | type  | possible_keys | key      | key_len | ref  | rows  | Extra       | 
  4. +----+-------------+-------+-------+---------------+----------+---------+------+-------+-------------+ 
  5. |  1 | SIMPLE      | test  | index | NULL          | idx_bnet | 9       | NULL | 68505 | Using index | 
  6. +----+-------------+-------+-------+---------------+----------+---------+------+-------+-------------+ 

all: 对于每个来自于先前的表的行组合,进行完整的表扫描,通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出

  1. mysql> explain select *  from test where create_time = '0000-00-00 00:00:00'; 
  2. +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 
  3. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra       | 
  4. +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 
  5. |  1 | SIMPLE      | test  | ALL  | NULL          | NULL | NULL    | NULL | 68505 | Using where | 
  6. +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 

5、possible_keys

possible_keys是指在这个SQL中,mysql可以使用这个索引去辅助查找记录,当查询涉及到的字段,都会被列出,但不一定被查询使用.若为空则表示没有可以使用的索引,此时可以通过检查where语句看是否可以引用某些列或者新建索引来提高性能。

6、key(重要)

key列显示的是当前表实际使用的索引,如果没有选择索引,则此列为null,要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX

7、key_len

key_len列显示MySQL决定使用的键长度。如果KEY键是NULL,则长度为NULL。在不损失精确性的情况下,长度越短越好

key len的长度还和字符集有关,latin1一个字符占用1个字节,gbk一个字符占用2个字节,utf8一个字符占用3个字节。key_len的计算法方法:

key_len只指示了where中用于条件过滤时被选中的索引列,是不包含order by或group by这一部分被选中的索引列

8、ref

ref列用来显示使用哪个列或常数与key一起从表中选择相应的行。它显示的列的名字(或const),此列多数时候为null

9、rows

rows列显示的是mysql解析器认为执行此SQL时必须扫描的行数。此数值为一个预估值,不是具体值,通常比实际值小

10、filtered

此参数为mysql 5.7 新加参数,指的是返回结果的行数所占需要读到的行(rows的值)的比例

对于使用join时,前一个表的结果集大小直接影响了循环的行数

11、extra(重要)

extra表示不在其他列并且也很重要的额外信息

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读