mysql show profile 性能分析工具

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: mysql show profile 执行时间 消耗时间 时间切片 -DENABLED_PROFILING=bool

mysql profile使用场景及方法

今天有客户反馈,同样的SQL和同样数据量的数据库在RDS和自建库上面,执行时间差异非常大,需要排查一下具体的原因,当时用了show profile给客户说明了具体时间花费在哪一步。首先当然看下具体情况、数据量、索引、执行计划等是否真的如客户所说完全一致,当然这不在我们这篇文档的范围内。

今天我们主要来讲一下mysql show profile查看SQL执行的时间到底去哪了。

准备工作

相关参数:
[profiling] 控制是否开启profiling,值为bool,默认为off。
[profiling_history_size] 控制保存的statement数量,默认为15,上限100,设置为0时关闭profiling。

语法:
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
}

使用profile之前,我们先要开启profiling,默认该参数是关闭的,我们可以会话级别设置开启来进行临时测试。

mysql> show variables like 'profiling';
Variable_name Value
profiling OFF

1 row in set (0.00 sec)
mysql> set session profiling = 1;

执行SQL:
select * from class_a_score where id = 1;

mysql> show variables like 'profiling_history_size';
Variable_name Value
profiling_history_size 15

SHOW profiles 结果:show profiles 是查看所有在history size(当前为15)的语句执行花费的时间和具体SQL语句。

mysql> show profiles;
Query_ID Duration Query
1 0.00034000 explain select * from class_a_score where id = 1
2 0.00304225 show variables like 'profiling_history_size'

指定上面SQL_ID,查看具体的query,每个阶段所花费的时间。(注意,show profile只显示上一条SQL的结果)
这里的status,就是show processlist中类似的结果。[可以另外加limit 和 offset 来控制输出内容]

mysql> show profile for query 1;
Status Duration
starting 0.000069
checking permissions 0.000011
Opening tables 0.000018
init 0.000027
System lock 0.000010
optimizing 0.000011
statistics 0.000041
preparing 0.000042
explaining 0.000041
end 0.000005
query end 0.000008
closing tables 0.000014
freeing items 0.000038
cleaning up 0.000005

14 rows in set, 1 warning (0.01 sec)

mysql> show profile for query 1 limit 1;
Status Duration
starting 0.000069

1 row in set, 1 warning (0.01 sec)

mysql> show profile for query 1 limit 1 offset 2;
Status Duration
Opening tables 0.000018

1 row in set, 1 warning (0.01 sec)

show profile 进阶

另外可以加上type 查看具体花费在CPU还是读写数据上等。

mysql> show profile cpu;
Status Duration CPU_user CPU_system
starting 0.000065 0.000000 0.000053
checking permissions 0.000011 0.000000 0.000010
Opening tables 0.000019 0.000000 0.000018
init 0.000016 0.000000 0.000016
System lock 0.000010 0.000000 0.000010
optimizing 0.000006 0.000000 0.000006
statistics 0.000010 0.000000 0.000009
preparing 0.000009 0.000000 0.000009
executing 0.000005 0.000000 0.000005
Sending data 0.000482 0.000000 0.000483
end 0.000006 0.000000 0.000005
query end 0.000008 0.000000 0.000009
closing tables 0.000008 0.000000 0.000008
freeing items 0.000051 0.000000 0.000060
cleaning up 0.000014 0.000000 0.000005

15 rows in set, 1 warning (0.01 sec)
D8D71183_D7C0_4b77_8AD5_BA7BD6CD755B
这个就是因为时间都花费在物理读上面,导致执行时间过长。

在performance_schema中的应用

因为官方文档中指出,可能再不久将来会废除show profile(因为确实有局限性,比如只能在当前会话使用),目前已经支持使用performance_schema来查看,如下是开启过程:

1、查看是否需要限制哪些前端线程会被记录
SELECT * FROM performance_schema.setup_actors;
INSERT INTO performance_schema.setup_actors
(HOST,USER,ROLE,ENABLED,HISTORY)
VALUES('localhost','test_user','%','YES','YES');

2、开启统计timer和eventUPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE (NAME LIKE '%statement/%' or NAME LIKE '%stage/%');

UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE (NAME LIKE '%events_statements_%' or NAME LIKE '%events_stages_%');

3.查找出来event_id
SELECT EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000,6) as Duration, SQL_TEXT
FROM performance_schema.events_statements_history_long WHERE SQL_TEXT like '%sql_text%'

4.把上一步查出来event_id带入
SELECT event_name AS Stage, TRUNCATE(TIMER_WAIT/1000000000000,6) AS Duration

FROM performance_schema.events_stages_history_long WHERE NESTING_EVENT_ID=<?>;

查考:
https://dev.mysql.com/doc/refman/5.6/en/show-profile.html

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
842 4
|
9天前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
51 11
|
1月前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
156 1
|
1月前
|
缓存 监控 Linux
掌握Linux性能分析:深入探索perf工具
【10月更文挑战第26天】
69 1
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
96 3
|
2月前
|
Web App开发 监控 JavaScript
一些常用的 Vue 性能分析工具
【10月更文挑战第2天】
149 1
|
3月前
|
SQL 缓存 关系型数据库
MySQL高级篇——性能分析工具
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long-query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。它的主要作用是,帮助我们发现那些执行时间特别长的 SOL 查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
MySQL高级篇——性能分析工具
|
3月前
|
安全 关系型数据库 MySQL
Navicat工具设置MySQL权限的操作指南
通过上述步骤,您可以使用Navicat有效地为MySQL数据库设置和管理用户权限,确保数据库的安全性和高效管理。这个过程简化了数据库权限管理,使其既直观又易于操作。
467 4
|
3月前
|
监控 IDE Java
【Java性能调优新工具】JDK 22性能分析器:深度剖析,优化无死角!
【9月更文挑战第9天】JDK 22中的性能分析器为Java应用的性能调优提供了强大的支持。通过深度集成、全面监控、精细化分析和灵活报告生成等核心优势,性能分析器帮助开发者实现了对应用性能的全面掌控和深度优化。在未来的Java开发过程中,我们期待性能分析器能够继续发挥重要作用,为Java应用的性能提升贡献更多力量。
|
3天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3