MySQL 优化利器 SHOW PROFILE 的实现原理

背景

近期,我遇到了一个案例,涉及到通过可传输表空间的方式导入一个体积达4GB的表,整个过程耗时13分钟。通过使用PROFILE进行性能分析,意外发现大部分时间都耗费在了System lock阶段。

mysql> set profiling=1; Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> alter table sbtest2 import tablespace; Query OK, 0 rows affected (13 min 8.99 sec)
mysql> show profile for query 1; +--------------------------------+------------+
| Status | Duration |
+--------------------------------+------------+
| starting | 0.000119 |
| Executing hook on transaction | 0.000004 |
| starting | 0.000055 |
| checking permissions | 0.000010 |
| discard_or_import_tablespace | 0.000007 |
| Opening tables | 0.000156 |
| System lock | 788.966338 |
| end | 0.007391 |
| waiting for handler commit | 0.000041 |
| waiting for handler commit | 0.011179 |
| query end | 0.000022 |
| closing tables | 0.000019 |
| waiting for handler commit | 0.000031 |
| freeing items | 0.000035 |
| cleaning up | 0.000043 |
+--------------------------------+------------+ 15 rows in set, 1 warning (0.03 sec)

同时,在执行SQL的过程中,show processlist显示的状态也是System lock

mysql> show processlist; +----+-----------------+-----------+--------+---------+------+------------------------+---------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+--------+---------+------+------------------------+---------------------------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 818 | Waiting on empty queue | NULL |
| 10 | root | localhost | sbtest | Query | 648 | System lock | alter table sbtest2 import tablespace |
| 14 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+-----------------+-----------+--------+---------+------+------------------------+---------------------------------------+ 3 rows in set, 1 warning (0.00 sec)

这种状态显示实际上具有很大的误导性。

接下来,我们将从SHOW PROFILE的基本用法出发,深入源码分析其实现原理,并探讨案例中的表空间导入操作为何大部分耗时集中在System lock阶段。

SHOW PROFILE 的基本用法

让我们通过一个示例来了解SHOW PROFILE的用法。

# 开启 Profiling
mysql> set profiling=1; Query OK, 0 rows affected, 1 warning (0.00 sec)
# 执行需要分析的 SQL
mysql> select count(*) from slowtech.t1; +----------+
| count(*) |
+----------+
| 1048576 |
+----------+ 1 row in set (1.09 sec)
# 通过 show profiles 查看 SQL 对应的 Query_ID
mysql> show profiles; +----------+------------+----------------------------------+
| Query_ID | Duration | Query |
+----------+------------+----------------------------------+
| 1 | 1.09378600 | select count(*) from slowtech.t1 |
+----------+------------+----------------------------------+ 1 row in set, 1 warning (0.00 sec)
# 查看该 SQL 各个阶段的执行耗时情况,其中,1 是该 SQL 对应的 Query_ID
mysql> show profile for query 1; +--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 0.000157 |
| Executing hook on transaction | 0.000009 |
| starting | 0.000020 |
| checking permissions | 0.000012 |
| Opening tables | 0.000076 |
| init | 0.000011 |
| System lock | 0.000026 |
| optimizing | 0.000013 |
| statistics | 0.000033 |
| preparing | 0.000032 |
| executing | 1.093124 |
| end | 0.000025 |
| query end | 0.000013 |
| waiting for handler commit | 0.000078 |
| closing tables | 0.000048 |
| freeing items | 0.000076 |
| cleaning up | 0.000037 |
+--------------------------------+----------+ 17 rows in set, 1 warning (0.01 sec)

如果指定all,还会输出更详细的统计信息,包括CPU、上下文切换、磁盘IO、IPC(进程间通信)发送/接收的消息数量、页面故障次数

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4446.html

(0)
LomuLomu
上一篇 2024 年 12 月 26 日
下一篇 2024 年 12 月 27 日

相关推荐

  • Grok Super自己账号充值方法完整教程

    国内用户开通 Grok Super 的充值教程,整理 Grok 充值、代充、国内支付、账号 ID 获取和确认充值步骤。

    未分类 1天前
    1400
  • 【蓝桥杯】第十六届Java B组竞赛解题实录

    题目A:高塔脱险 基础难度题目,主要考察基本编程能力,但需特别注意数值范围问题,使用int类型可能导致数据溢出正确答案:202 package competition.t1; import java.io.*; public class Solution { static class FastIO { static InputStreamReader rea…

    2025 年 5 月 13 日
    44800
  • 【永久激活】IDEA 2024.1.2 激活破解详细指南,附激活码+工具,亲测可用

    IntelliJ IDEA 是一款功能强大的 Java 集成开发环境,被誉为最优秀的 Java 开发工具之一。本文将介绍通过脚本免费激活 IDEA 和 JetBrains 全家桶工具的方法,支持 2021 年及以上版本,包括最新版本。 一、下载并安装 IDEA 首先,前往 JetBrains 官网下载最新版本的 IntelliJ IDEA。安装过程简单,按照…

    未分类 2024 年 7 月 8 日
    3.5K00
  • 多租户解析与Demo

    在做Saas应用时,多租户解析往往是很重要的组成部分,也是用户访问网站最先处理的逻辑。 文前介绍: 多租户的数据库实现方式主要有三种: 单一数据库实现,每条数据标识租户Id进行识别数据属于哪个租户 一租户一个数据库,能够做到完全的数据隔离 混合模式,部分数据在一张表上,主要是一些基础数据;其他业务数据分库存储。 无论是哪种方式都要知道租户是谁才能查询数据库。…

    2025 年 1 月 1 日
    57200
  • 使用 gt-checksum 迁移表结构到 GreatSQL

    将数据库表结构迁移至 GreatSQL 的指南 引言 本文旨在指导如何利用 gt-checksum 工具,将数据库表结构从 ORACLE 迁移至 GreatSQL。 gt-checksum 简介 gt-checksum 是 GreatSQL 社区开发的开源静态数据库校验和修复工具,它支持包括 MySQL 和 Oracle 在内的多种主流数据库系统。其商业版本…

    未分类 2024 年 12 月 24 日
    70300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信