以往我们已经介绍了一个mysql的分析工具:mysql慢查询日志分析工具(pt-query-digest),可以看我的文章:mysql慢查询日志分析工具(pt-query-digest)-CSDN博客
一、profiling的介绍
sql查询慢的情况很常见,对于慢sql的优化有三个步骤,又称优化三板斧。
板斧一:查看执行计划explain
板斧二:建立合适索引
板斧三:使用合适的连接关系和过滤条件来实现sql语句的优化
如果执行计划正确sql语句的性能还很慢,可以通过mysql的profiling工具进行定位分析。
为了更精准的定位一条sql语句的性能问题,需要清楚的直到这条sql语句运行时消耗多少系统资源。mysql中profiling工具可以满足此需求,通过该工具可以获取一条sql语句在执行过程中多种资源的消耗情况——比如cpu,io,ipc,swap等资源消耗情况。
二、profiling使用方法
2.1、启用命令
set profiling = 1;
2.2、启动命令后,运行想要查询性能的sql语句
select * from xiatui where name like '0%' and age = '9803' and sex =0;
2.3、查询上述sql语句信息
show profiles;
说明:
Query_ID:sql语句的id编号,这个编号会在步骤4、5用到
Duration:sql语句执行时长
Query:具体的sql语句
2.4、查询资源消耗情况
SHOW PROFILE CPU, BLOCK IO FOR QUERY 360;
上述360就是第三步骤的Query_ID值,想要查询哪条sql语句,就输入哪条sql语句对应的id值。
2.5、查询某条sql语句的具体执行时间
SHOW PROFILE FOR QUERY 391;
优化建议:如果想要优化某条sql语句,可以关注一下该条sql语句的show profile结果中每个阶段的耗时,分析耗时最长的阶段。如果status列出现下面的信息就可以考虑对sql语句进行优化:
converting heap to MyISAM:查询结果太大,内存不够用
creating tmp table:创建了临时表。先拷贝数据到临时表,用完后再删除临时表。
copying to tmp table on disk:把内存中临时表复制到磁盘上
locked:发生了死锁行为。
2.6、关闭
set profiling = 0;
三、整体使用过程
set profiling = 1;
select /*+ no_icp(xiatui) */ * from xiatui where name like '0%' and age = '9803' and sex =0;
select * from xiatui where name like '0%' and age = '9803' and sex =0;
show profiles;
set profiling = 0;