你还在只会使用explain进行mysql的sql分析定位吗? 你还在为明明走了索引但是执行时间很长烦恼吗?

下面就告诉你如何更深层次的查找问题,

第一步:我们可以通过执行概况,去了解总体时间主要消耗在了哪些地方?

就像是上面这样,期间代表的就是时间,单位为s。

从上面的图中,我们就可以知道主要消耗在creating sort index上面,我们只要将creating sort index 给减小就可以提高sql 执行效率了。

 1 概况字段解析:
 2 starting
 3 Reading from net:表示server端正通过网络读取客户端发送过来的请求。建议减小客户端发送数据包大小,提高网络带宽质量。
 4 checking permissions:  安全检查,检查是否有权限。
 5 copy to tmp table:执行alter table修改表结构时。建议凌晨执行。
 6 copying to tmp table:拷贝数据到内存中的临时表,常见于group by操作时。建议创建索引。
 7 copying to tmp table on disk:临时结果集太大,内存中放不下,需要将内存中的临时表拷贝到磁盘上,形成#sql***.MYD、#sql***.MYI。建议创建索引,加大sort_buffer_size/tmp_table_size/max_heap_table_size。
 8 creating tmp table:创建基于内存或磁盘的临时表,当从内存转成磁盘临时表时,状态会转变成copying to tmp table on disk。建议创建索引。
 9 Opening tables
10 init
11 system lock:正在等待系统级锁。建议关闭外部锁skip external locking(默认是关闭的)
12 optimizing
13 statistics:进行数据统计以便解析执行计划(数据库正在生成合理的执行计划),如状态比较经常出现,有可能是磁盘IO性能很差。建议查看当前IO性能状态,例如iowait。
14 preparing
15 sorting result:正在对结果进行排序,类似creating sort index,不过是正常表,而不是在内存中进行排序。建议创建索引。
16 executing
17 sending data:从server端发送数据到客户端,也有可能是接收存储引擎返回的数据,再发送给客户端,数据量很大时尤其经常能看见。建议通过索引或limit,减少需要扫描的数据量。(sending data不是网络发送,是从磁盘读取。发送到网络是writing to net)
18 removing tmp table:删除select中用完的临时表。
19 Creating sort index :当前select中需要用到临时表,在进行order by排序。过高可以考虑更换order by的字段
20 end
21 query end
22 closing table:用完了,关闭该表,刷新到磁盘。如果长时间处于该状态,有可能磁盘满了。
23 freeing items:通常是cleaning up之后的状态,例如正在释放query cache。
24 cleaning up :打扫战场 - 释放内存,释放持有的句柄等。
概况字段解析

第二步:那么我们又可以点击状态,查看哪些行的数据较大

如上图,我们就可以知道sort 排序使用了62707行。那么我们就可以针对排序选择更为合理字段。减少排序行。

 

posted on 2019-06-19 14:28  进_进  阅读(247)  评论(0)    收藏  举报