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 日

相关推荐

  • 全网最详细的Spring入门教程

    为什么用Spring 什么是Spring Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。 Spring的一个最大的目的就是使JAVA EE开发更加容易 。同时,Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单…

    2024 年 12 月 24 日
    15300
  • 【2024最新版】Java JDK安装配置全攻略:图文详解

    目录 1. 引言 2. 准备工作 2.1 确定操作系统 2.2 检查系统要求 2.3 下载JDK安装包 3. 安装步骤(以Windows系统为例) 4. 配置环境变量 4.1 jdk配置验证 4.2 配置JAVA_HOME环境变量 4.3 配置Path环境变量 4.4 验证jdk是否配置成功 5. 结语 1. 引言 随着技术的不断发展和更新,Java作为世界…

    2024 年 12 月 28 日
    11100
  • Java 面试八股文(真实,高频,有详细答案)

    这套互联网 Java 工程师面试题包括了:MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题 一、Java 基础1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,jav…

    2025 年 1 月 5 日
    11600
  • 华为OD机试E卷 –跳马–24年OD统一考试(Java & JS & Python & C & C++)

    文章目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码 Java算法源码 python算法源码 c算法源码 c++算法源码 题目描述 马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或者直者走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称”马走日”字。给定 m 行 n 列的棋盘(网格图),棋盘上只有棋子象…

    未分类 2025 年 1 月 6 日
    15900
  • Mysql身份认证过程

    背景 最近有一些hersql的用户希望能支持mysql的caching_sha2_password认证方式,caching_sha2_password与常用的mysql_native_password认证过程差异还是比较大的,因此抽空研究了一下caching_sha2_password身份认证过程,并为hersql支持了caching_sha2_passwo…

    2025 年 1 月 14 日
    9000

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信