MySQL#秘籍#一条SQL语句执行时间以及资源分析

背景

一条 SQL 语句的执行完,每个模块耗时,不同资源(CPU/IO/IPC/SWAP)消耗情况我该如何知道呢?别慌俺有 - MySQL profiling

1. SQL语句执行前 - 开启profiling
sql 复制代码
-- profiling (0-关闭 1-开启)
-- 或者:show variables like 'profiling';
mysql> select @@profiling;

-- 开启
mysql> SET profiling = 1;
-- 关闭
mysql> SET profiling = 0;
2. 执行某个SQL语句
3. 执行分析

3.1 显示当前会话产生的所有profiles

mysql> show profiles;

说明:每次最多显示最近15条profiles

Query_ID: 每条SQL语句ID编号

Duration:SQL语句执行时长

Query:具体的SQL语句

3.2 查看最近一条SQL执行情况

mysql> show profile;
3.3 查看指定query id的执行情况

mysql> show profile for query xxx_query_id;

  1. Status: 显示了SQL执行的一个完整的生命周期,涉及到各个阶段。
  2. Duration: 表示SQL在这个阶段的耗时。

3.4 执行资源(CPU/IO/IPC/SWAP)分析

mysql> show profile CPU, BLOCK IO for query xxx_query_id;

说明:show profile不指定type时默认只显示 Status 和 Duration

ALL:显示所有的开销信息。

BLOCK IO:显示块存储设备输入和输出的次数,即从硬盘读取和写入数据的次数。只有当数据量大于内存可用量时,才会借助硬盘进行内存交换(Swap),才会产生硬盘读取和写入。

CONTEXT SWITCHES:上下文切换开销。

CPU:显示CPU开销信息。

IPC:显示发送和接收开销信息。

MEMORY:显示内存开销信息。

PAGE FAULTS:显示页面错误开销信息。

SOURCE:显示和Source_function,Source_file, Source_line相关的开销信息。

SWAPS:显示交换次数开销信息。
注意事项:

  1. profile统计的数据依赖于底层system call调用,某些操作系统上不支持调用时值会返回NULL
  2. profiling统计的信息是进程级别而非线程级别,统计信息时刻在变更。
  3. Profiling信息还可以通过INFORMATION_SCHEMA PROFILING table 查询
    SELECT STATE, FORMAT(DURATION, 6) AS DURATION FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = 2 ORDER BY SEQ;
  4. 从profiling分析结果Status中得到优化方向
    • converting HEAP to MyISAM: 查询结果太大,内存不够用
    • Creating tmp table: 创建临时表。先拷贝数据到临时表,用完后再删除临时表
    • Copying to tmp table on disk: 把内存中临时表复制到磁盘上
    • locked: 发生了死锁行为
复制代码
SHOW PROFILE [type [, type] ... ]
    [FOR QUERY n]
    [LIMIT row_count [OFFSET offset]]

type: {
    ALL
  | BLOCK IO
  | CONTEXT SWITCHES
  | CPU
  | IPC
  | MEMORY
  | PAGE FAULTS
  | SOURCE
  | SWAPS
}

参考文档

https://dev.mysql.com/doc/refman/8.0/en/show-profile.html

profiling Statue : https://dev.mysql.com/doc/refman/8.0/en/general-thread-states.html

相关推荐
AIgorithmGEEK5 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
Lost_the_wind5 小时前
MySQL学习笔记四
mysql
geovindu9 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
for_ever_love__9 小时前
MySQL SELECT 与 WHERE 优化实战:可搜索条件、联合索引与执行计划
数据库·mysql·oracle·select·where·条件优化·查询优化技巧
2501_9318037510 小时前
MySQL 锁机制详解
数据库·mysql
.Hypocritical.12 小时前
MySQL |常用 SQL 语句与 pymysql 函数
mysql
NineData13 小时前
MySQL 到 Doris 实时数据同步:订单、用户和日志数据入仓方案
数据库·mysql
Dovis(誓平步青云)14 小时前
现场问题先关闭还是先验收,建筑任务怎样处理依赖
前端·javascript·数据库·mysql·音视频
xuefuhe15 小时前
MySQL:group_replication_start_on_boot vs group_replication_bootstrap_group
mysql
for_ever_love__15 小时前
MySQL Online DDL 完全指南:INSTANT/INPLACE/COPY 三种算法、MDL 锁事故与 gh-ost 实战
数据库·mysql·ddl·online·gh-ost·锁表·加字段