当我们在优化sql的时候可以使用explain来查看执行计划,可当根据执行计划优化完毕之后我们的sql的运行时间还是比较长,这时怎么办?
更细粒度的分析,show-profile,可以提高用来分析当前会话中语句执行的资源消耗情况,可以用于sql调优的测量.
官网地址 show_profile
默认情况下,处于关闭状态
查看状态
SHOW VARIABLES LIKE 'profiling';
开启命令,(仅对当前数据库有效)
SHOW VARIABLES LIKE 'profiling';
SET profiling=ON;/**也可以使用SET profiling = 1;/
SHOW VARIABLES LIKE 'profiling';
开启之后执行sql,并人为制造一条慢sql
SELECT * FROM sys_job_running_infos LIMIT 10;
SELECT * FROM sys_job_running_infos GROUP BY JOB_RUNNING_INFO_ID%10 LIMIT 15;
查看结果;
SHOW PROFILES;
show profile;/**默认显示最近的一条/
诊断sql,show profile cpu,block io for query 上一步前面的SQL数字号码;
type
可以指定 可选值以显示特定的其他类型的信息:
-
ALL
显示所有信息 -
BLOCK IO
显示块输入和输出操作的计数 -
CONTEXT SWITCHES
显示自愿和非自愿上下文切换的计数 -
CPU
显示用户和系统CPU使用时间 -
IPC
显示发送和接收的消息的计数 -
MEMORY
目前尚未实施 -
PAGE FAULTS
显示主要和次要页面错误的计数 -
SOURCE
显示源代码中的函数名称,以及函数发生的文件的名称和行号 -
SWAPS
显示交换计数
一条sql完整的查询明细计划,下面是我们的那条慢sql的执行
很明显比第一条sql多了几步操作,如创建临时表删除临时表等,最消耗的时间的地方是Sending data;
“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”.
备注:
-
QUERY_ID
是一个数字语句标识符。 -
SEQ
是一个序列号,表示具有相同QUERY_ID
值的行的显示顺序 。 -
STATE
是行测量适用的分析状态。 -
DURATION
表示语句执行在给定状态下保持多长时间(以秒为单位)。 -
CPU_USER
并CPU_SYSTEM
指示用户和系统CPU的使用,以秒为单位。 -
CONTEXT_VOLUNTARY
并CONTEXT_INVOLUNTARY
指出发生了多少自愿和非自愿的上下文切换。 -
BLOCK_OPS_IN
并BLOCK_OPS_OUT
指示块输入和输出操作的数量。 -
MESSAGES_SENT
并MESSAGES_RECEIVED
指出发送和接收的通信消息的数量。 -
PAGE_FAULTS_MAJOR
并PAGE_FAULTS_MINOR
指出主要和次要页面错误的数量。 -
SWAPS
表示发生了多少次掉期。 -
SOURCE_FUNCTION
,SOURCE_FILE
并SOURCE_LINE
提供指示配置文件状态在源代码中的位置执行的信息。
结论:
- convering HEAP to MYISAM: 查询结果太大,内存都不够用了往磁盘上搬了
- Createing tmp table: 拷贝数据至临时表,用完还要删除
- Copying to temp table on dsk:把内存中临时表复制到磁盘,危险!
- locked 锁。。。
查询日志(默认关闭)
show variables like '%general_log%';
打开并设置写入表中
SET GLOBAL general_log=1;/**查询日志打开**/
SET GLOBAL log_output='TABLE';/**日志写入表中**/
SHOW VARIABLES LIKE 'log_output';/**显示写入方式**/
MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行,因此切记在生产库中切记不要打开这个功能.