mysql用profile查看语句的执行情况
有一些耗时非常长的语句,可以通过如下语句检测出来,哪里出了问题。
1.首先确保profile功能开启
show variables like 'profiling'
如果是on才是开启的
没开启执行set profiling=on
。
2.执行sql查询语句
因为profile是检测你的查询语句性能分别耗时多少,所以得执行一下select吧。
3.show profiles
show profiles
用来查看之前执行过的语句
4.显示语句具体信息
show profile cpu,block io for query 3
show profiles的查询结果会得到查询的id,show profile就可以看到具体数据库的执行情况,哪一步消耗了多长时间。
下面是我的某个查询语句的情况:
图片mysql-profile结果
show profile的参数共有下面这几种:
- all,显示所有信息
- block io,显示io块开销
- context switches,上下文切换相关开销
- cpu,显示cpu相关开销
- ipc,显示发送和接收相关开销
- memory,显示内存相关开销
- page faults,显示页面错误相关开销
- source,显示和source_function, source_file, source_line相关的开销信息
- swaps,显示交换次数的开销
主要是cpu和io。
在CPU和IO显示的条目里面有四个是不能出现的,他们非常耗时。
- converting HEAP to MyISAM:内存不够用,数据粗在磁盘上了
- creating tmp table:拷贝数据到临时表,用完还要删除
- copying to tmp table on disk:把内存中的临时表复制到硬盘
- locked
如果在测试环境中可以这么干
记录所有表的日志
set global general_log=1
set global log_output='TABLE'
上面这两句会把sql的执行情况存储到 mysql 库里面的 general_log 表。
然后select * from mysql.general_log
注意,只能在测试时候用
用status查看行锁的竞争情况
show status like 'innodb_row_lock%'
出现的字段说明如下:
- Innodb_row_lock_current_waits: 当前正在等待锁定的数量
- Innodb_row_lock_time: 从系统启动到现在锁定时间总长度
- Innodb_row_lock_time_avg: 每次等待花费的平均时间
- Innodb_row_lock_time_max: 从系统启动到现在等待最长的一次花费的时间
- Innodb_row_lock_waits: 系统启动后到现在总共等待次数