1 前言
在应用的开发过程中,由于开发初期的数据量一般都比较小,所以开发过程中一般都比较注重功能上的实现,但是当完成了一个应用或者系统之后,随着生产数据量的急剧增长,那么之前的很多sql语句的写法就会显现出一定的性能问题,对生产的影响也会越来越大,这些不恰当的sql语句就会成为整个系统性能的瓶颈,为了追求系统的极致性能,必须要对它们进行优化。
2 正文
前面有一篇文章:几个必须掌握的SQL优化技巧(三):Explain分析执行计划介绍了如何使用explain命令对sql的执行计划进行分析,具体的命令格式如下
explain + select语 复制代码
今天这篇文章将会介绍如何使用show profile命令来分析SQL性能和具体的时间耗费情况。
MySQL从5.0.37版本开始增加了对show profile和show profiles语句的支持,所以要想使用此功能,要确保版本在5.0.37之后。show profiles能够在做SQL优化时帮助我们了解SQL语句的性能耗费。
在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析。该参数可以在全局和session级别来设置。对于全局级别则作用于整个MySQL实例,而session级别紧影响当前session。该参数开启后,后续执行的SQL语句都将记录其资源开销,诸如IO,上下文切换,CPU,Memory等等。根据这些开销进一步分析当前SQL瓶颈从而进行优化与调整。
通过have_profiling参数,能够看到当前MySQL是否支持profile:
默认profiling是关闭的,那么可以通过set语句在session级别开启profiling:
set profiling=1 复制代码
通过profile,能够清楚的了解SQL执行的过程。
比如输入show profiles命令后,我们可以看到各个sql语句执行的耗时:
queryid表示当前查询的id;query表示执行的sql操作;duration表示sql操作执行的时间耗费。
执行完上面的show profiles命令后,可以通过下面的命令来具体分析某个sql语句的时间具体耗费情况:
show profile for query query_id 复制代码
比如分析query_id为175的sql操作的具体情况:
show profile for query 175 复制代码
结果如下:
Status表示状态阶段,而Duration表示该状态阶段的耗时。
在获取了最小消耗时间的线程状态之后,mysql支持进一步选择all、cpu、block io、page faults等明细类型查看mysql在使用什么资源上耗费了过高的时间,如果输入:
show profile for all query query_id 复制代码
则可以展示所有的信息,部分如下:
也可以输入
show profile for 上面结果的某个具体字段 query query_id 比如 show profile for cpu query query_id 复制代码
查看详细的具体情况。
3 总结
这篇文章主要介绍了show profiles和show profile命令来查看sql操作在各个阶段的具体耗时情况,从而方便我们进行后续的sql优化操作。
后面将会继续分享关于sql优化的其他方法、步骤。