1.查看数据库profile 是否开启两种方式
show variables like '%profiling%
SELECT @@profiling
默认profiling是关闭的,可以通过set语句在Session级别开启profiling:
set profiling=1; //开启profiling 开关;
2.show prifiles 命令
show prifiles可以查看最近的几次查询
根据 Query_ID,可以进一步执行 show profile cpu,block io for query Query_id 来查看 sql 的具体执行步骤。
3.根据id分析sql性能
show profile cpu,block io for query Query_id
可以看到sending data 的时间耗时久:
Sending data 状态表示MySQL线程开始访问数据行并把结果返回给客户端,而不仅仅是返回个客户端。由于 在Sending data状态下,MySQL线程往往需要做大量的磁盘读取操作,所以经常是整各查询中耗时最长的状态。
4.show profile的常用查询参数
ALL:显示所有的开销信息。
BLOCK IO:显示块IO开销。
CONTEXT SWITCHES:上下文切换开销。
CPU:显示CPU开销信息。
IPC:显示发送和接收开销信息。
MEMORY:显示内存开销信息。
PAGE FAULTS:显示页面错误开销信息。
SOURCE:显示和Source_function,Source_file,Source_line相关的开销信息。
SWAPS:显示交换次数开销信息。
5.注意事项
a. converting HEAP to MyISAM:查询结果太大,内存不够,数据往磁盘上搬了。
b. Creating tmp table:创建临时表。先拷贝数据到临时表,用完后再删除临时表。
c. Copying to tmp table on disk:把内存中临时表复制到磁盘上,危险!!!
d. locked。
如果在show profile诊断结果中出现了以上4条结果中的任何一条,则sql语句需要优化。