1、使用Navicat对sql进行分析最主要的有两个点,第一点查看SQL的执行概况:
image.png
这些信息就是这个SQL语句执行的整个过程各个阶段所占用时间的比例,后面一列Percentage就是占用比例,从这个截图可以看见,Sendingdata占用整个sql执行过程约73%时间。
分析主要信息项:
1)Opening tables 这个是表示这个SQL拿到这个表的使用权所占用的时间,如果在一个SQL中过长,则有可能表示当前表被锁,被一些其他线程占用,可以查一下当前表的状态。
2)Sending data包括两个部分,收集和发送数据。这里的关键是为什么要收集数据,原因在于:mysql使用“索引”完成查询结束后,mysql得到了一堆的行id,如果有的列并不在索引中,mysql需要重新到“数据行”上将需要返回的数据读取出来返回个客户端。如果这部分占用时间过程,有可能是索引问题,或者字段长度过大导致。
2、使用explain关键字分析SQL
image.png
分析各个标识的含义
1)id 这个查询的序列号。
2)select_type 是代表当前查询类型。常见类型有以下几种:
Ⅰ、simple 可以理解为简单查询,或者单表查询不需要关联其他表或者自身关联。
Ⅱ、PRIMARY 一个需要子查询或者关联查询的sql,位于最外层的查询为PRIMARY。
Ⅲ、union union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union。
Ⅳ、dependent union 与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响。
Ⅴ、derived from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select。
3)、table 就是SQL所使用的的表名。
4)、type 查询类型,各个查询类型从好到坏的顺序为:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说除了特殊情况,得保证查询至少达到range级别,最好能达到ref。
5)、possible_keys 表示当前查询可能使用到的索引。如果当前SQL性能较低,且这一列没有显示内容,则应当考虑增加索引。
6)、key 显示MySQL实际决定使用的键。如果没有索引被选择,则显示为NULL。
7)、key_len 显示MySQL决定使用的键长度。如果键是NULL,长度就是NULL。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。
8)、ref 显示哪个字段或常数与key一起被使用。
9)、rows 表示当前sql要遍历多少行才能找到需要的数据,但是不是精确数据。
10)、Extra 当值为Only index时表示当前查询只使用索引即可,当值为Using where则表示当前使用了where限制条件。如果为Using where或者Using temporary则表示当前查询性能很差。可以考虑优化。
网友评论