MySql--Explain 详解(下)
2019-05-20 本文已影响0人
简书徐小耳
具体细节 请去掘金购买《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字段展示的信息类似于查询优化器将我们的查询语句重写后的语句,并不是等价