MySql--Explain 详解(下)

具体细节 请去掘金购买《MySQL 是怎样运行的:从根儿上理解 MySQL》

EXPLAIN

Extra

  • 1.通过这些额外信息来更准确的理解MySQL到底将如何执行给定的查询语句
  • 2.No tables used:当查询语句的没有FROM子句时将会提示该额外信息
  • 3.Impossible WHERE:查询语句的WHERE子句永远为FALSE时将会提示该额外信息
  • 4.No matching min/max row:当查询列表处有MIN或者MAX聚集函数,但是并没有符合WHERE子句中的搜索条件的记录时
  • 5.Using index:可以使用索引覆盖的情况
  • 6.Using index condition:有些搜索条件中虽然出现了索引列,但却不能使用到索引,比如下边这个查询
    SELECT * FROM s1 WHERE key1 > 'z' AND key1 LIKE '%a';
    key1 > 'z'走索引,然后在二级索引中根据条件筛选 符合条件的记录,再去
    主键中查询。
  • 7.Using where:我们使用全表扫描来执行对某个表的查询,并且该语句的WHERE子句中有针对该表的搜索条件时
    ,使用索引访问来执行对某个表的查询,并且该语句的WHERE子句中有除了该索引包含的列之外的其他搜索条件时,在Extra列中也会提示上述额外信息
  • 8.Using join buffer (Block Nested Loop):在连接查询执行过程中,当被驱动表不能有效的利用索引加快访问速度,MySQL一般会为其分配一块名叫join buffer的内存块来加快查询速度,也就是我们所讲的基于块的嵌套循环算法
  • 9.Not exists:当我们使用左(外)连接时,如果WHERE子句中包含要求被驱动表的某个列等于NULL值的搜索条件,而且那个列又是不允许存储NULL值的
  • 10.Using intersect(...)、Using union(...)和Using sort_union(...):分别使用intersect,union和sort_union索引合并的方式查询
  • 11.Zero limit:当我们的LIMIT子句的参数为0时,表示压根儿不打算从表中读出任何记录
  • 12.Using filesort:在内存中(记录较少的时候)或者磁盘中(记录较多的时候)进行排序
  • 13.Using temporary:使用了临时表来完成一些功能,比如去重、排序之类的。
  • 14.Start temporary, End temporary:查询优化器会优先尝试将IN子查询转换成semi-join,而semi-join又有好多种执行策略,当执行策略为DuplicateWeedout时,
    也就是通过建立临时表来实现为外层查询中的记录进行去重操作时,驱动表查询执行计划的Extra列将显示Start temporary提示,
    被驱动表查询执行计划的Extra列将显示End temporary提示
  • 15.LooseScan:在将In子查询转为semi-join时,采用的是LooseScan执行策略
  • 16.FirstMatch(tbl_name):在将In子查询转为semi-join时,采用的是FirstMatch执行策略

Json格式的执行计划

  • 1.在EXPLAIN单词和真正的查询语句中间加上FORMAT=JSON,里面可以看到执行成本
  • 2.read_cost:IO成本和检测rows × (1 - filter)条记录的CPU成本
  • 3.eval_cost:检测 rows × filter条记录的成本。
  • 4.prefix_cost:单独查询的成本,等于read_cost + eval_cost
  • 5.data_read_per_join:此次查询中需要读取的数据量

SHOW WARNINGS

  • 1.在执行完EXPLAIN之后,立马执行SHOW WARNINGS,可以看到三个字段.level,Code,Message
  • 2.Message字段展示的信息类似于查询优化器将我们的查询语句重写后的语句,并不是等价

你可能感兴趣的:(MySql--Explain 详解(下))