这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
Explain工具介绍
当我们在开发时,需要优化执行sql语句,通过使用Explain关键字可以模拟,语句的分析查询或性能结构瓶颈。
explain关键字增加在select语句前,标记查询mysql,执行查询语句后,返回执行计划的信息出来,执行这条SQL。
Explain的两个变种
1)explain extended:查询优化的信息会额外提供出来,show warnings命令可以得到优化后的查询语句。还有一个半分比的值,filtered列, 通过估算rows * filtered /100 ,将要和前一个表进行连接的explain中的行数。
2) explain partitions:partitions字段是它多的部分。
explain中的列
1、id列
id列的编号是select的序列号,有几个select就有几个id,并且id的顺序是按select出现的顺序增长的。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。
2、select_type列
select_type表示对应行是简单还是复杂的查询。
1)simple:子查询不包含,还有不含union,查询较为简单
2)primary:select是较为复杂查询的查询的外层
3)subquery:包含在select中的子查询(不在from子句中)
4)derived:在临时表中存放结果,也称为派生表(derived的英文含义),from的子层
5)union:就是随后的select和其中一个
3、table列
当用explain访问某一行的表时就是用table。
当from子句中有子查询时,格式作为table列,表示当前查询依赖id=N的查询。于是先执行id=N的查询。
union查询时,是对id分别为1和2的结果集合并以后再去重,所以设置<union1,2>是table列名称,select行id分别为1和2。
4、type列
访问类型,如何查找表的行是由mysql来决定,也可以称为是关联类型,大概范围内查找数据行记录。
依次从最优到最差分别为:system>const>eq_ref>ref>range>index>ALL
一般来说,如果能保证能达到range级别的查询,就是不错的性能,当然最好的情况就是达到ref。
未完待续... 后续还有一些常见的列可以执行优化。例如: 5、possible_keys列 6、key列 7、key_len列 8、ref列 9、rows列 10、Extra列