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/4373.html

赞 (0)
LomuLomu
上一篇 2024 年 12 月 24 日 下午9:38
下一篇 2024 年 12 月 24 日

相关推荐

  • PostgreSQL 的历史

    “`markdown title: PostgreSQL 的历史date: 2024/12/23updated: 2024/12/23author: cmdragon excerpt:PostgreSQL,一个功能全面且广受青睐的开源关系型数据库管理系统,其起源可追溯至1986年,由加州大学伯克利分校的研究小组所开发。本文将深入探讨PostgreSQL的起…

    2024 年 12 月 26 日
    87000
  • ChatGPT Plus订阅微信支付宝付款方法月付订阅

    国内用户想开通 ChatGPT Plus,真正麻烦的通常不是注册,而是订阅付款。国内银行卡不一定能直接扣款,所以很多人会改找支持微信、支付宝的充值方式。对于主要用 ChatGPT 来生成客服回复的产品经理,更稳妥的思路是适合不熟悉海外订阅的人;项目复盘要补齐背景,同时需要一套能复用的开通流程时,直接把会员开到自己的原账号里会更省心。

    未分类 2026 年 8 月 6 日
    15800
  • SuperGrok和Grok订阅有什么区别?会员值不值

    对比免费Grok与SuperGrok会员的模型、实时搜索、图片视频、Expert和使用额度,说明哪些人值得订阅。

    未分类 2026 年 7 月 18 日
    19100
  • ChatGPT Plus充值教程:付款后关闭页面怎么继续

    买完 ChatGPT Plus 卡密后误关页面,先回到原订单查发货信息,再从已经完成的环节继续。关闭网页不能说明付款已取消,也不能说明会员已开通。把付款、取卡密、确认账号这几个位置分清,就能判断接下来需要找订单还是回到 ChatGPT 查看状态。需要国内支付时,可以通过下面的本人账号充值入口购买对应服务。

    未分类 2026 年 9 月 10 日
    8400
  • 2025年蓝桥杯Java B组赛题深度剖析与解题策略

    作为一名连续两年参与蓝桥杯软件类Java B组竞赛的选手,我深刻体会到这项赛事对参赛者算法功底和临场应变能力的全面考验。今年的题目延续了蓝桥杯”夯实基础、鼓励创新”的命题风格,每道试题都像精心设计的思维迷宫,等待着选手用代码这把钥匙来开启。本文将系统梳理本届Java B组的典型赛题,通过全新的视角解析解题思路,分享编程实践中遇到的典型问题及其解决方案。这些内…

    未分类 2025 年 5 月 15 日
    70400

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信