暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL中KILL指令的工作原理讲解


点击标题下「蓝色微信名」可快速关注

技术社群的这篇文章《图解 MySQL 第二篇 | KILL 的工作原理》是对Percona工程师Yunus Uyanik写的译文,主要探讨MySQL如何使用KILL命令处理线程终止,如图表所示,并提供示例演示以帮助更好理解。

原文链接,

https://www.percona.com/blog/mysql-with-diagrams-part-two-how-kill-works/,January 7, 2025

很多人自以为了解这个主题,但实际上并非如此,或者理解有误。KILL 操作并非由运行 KILL 命令的线程处理,而是由被另一个线程终止的线程本身处理。这有点令人困惑,所以用图表来说明比较好。

该图说明了两个线程之间的交互:

  • 线程 ID 10 表示正在主动执行查询的工作线程。

  • 线程 ID 12 发出 KILL 10 命令以终止线程 ID 10。

线程 10: 该线程进入循环,分块处理查询。对于 ORDER BY 、 GROUP BY 或 ALTER TABLE 等操作 ,它会读取行块,处理这些行,并确认这些行。处理完每个行块后,它会检查 thd_killed() 标志,以确定是继续执行还是终止。

线程 12: 该线程发送 KILL 命令, 使用函数 thd_set_kill_status() 设置线程 10 的终止标志.

Kill 标志行为

如果终止标志未设置 ( thd_killed()=0
 ),线程 10 将继续处理。如果终止标志已设置 ( thd_killed()=1
 ),则查询执行将中止,临时表将被丢弃,所有活动事务都将回滚。

MySQL 函数:is_killed()

函数 is_killed()
 检查线程是否应该终止:

bool Sql_data_context::is_killed() const {
  const auto kill = thd_killed(get_thd());
  DBUG_LOG("debug", "is_killed:" << kill);
  if (0 == killreturn false;
  return ER_QUERY_INTERRUPTED != kill;
}

如果 kill == 0 ,线程继续运行。如果为 kill != 0the thread is interrupted, , 则停止进一步执行。

结论

通过理解 KILL 命令以及 MySQL 如何管理线程生命周期,您可以判断或理解为什么它比预期花费的时间更长。与往常一样,请仔细检查您的查询,并避免在生产环境中不加区分地终止线程,因为这可能会中断关键操作。安全总比后悔好。


如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发朋友圈,


可以到各大平台找我,
  • 微信公众号:@bisal的个人杂货铺
  • 腾讯云开发者社区:@bisal的个人杂货铺
  • 头条号:@bisal的个人杂货铺
  • CSDN:@bisal
  • ITPub:@bisal
  • 墨天轮:@bisal
  • 51CTO:@bisal
  • 小红书:@bisal
  • 抖音:@bisal
近期更新的文章:
如何通过MCP同Oracle 23ai数据库进行交互?
刺激的周末联赛
如何薅大模型API的羊毛?
MySQL升级过程中排序导致的性能问题场景
"无任欢迎"是什么意思?
近期Vlog:
Skyline Luge
新疆之行(红山体育馆 - 国际大巴扎 - 红山公园 - 天山天池)
新疆之行(天马浴河 - 哈因塞 - 那拉提 - 依提根塞)
新疆之行(六星街 - 伊昭公路 - 夏塔)
京沪哪吒大战
骑行日记
曼联老特拉福德球场tour
国安骑行记
近期图片库:
Queen Wen
China Zeng
热文鉴赏:
揭开"仿宋"和"仿宋_GB2312"的神秘面纱
Linux的"aarch"是多了个"a"?
中国队“自己的”世界杯
你不知道的C罗-Siu庆祝动作
大阪环球影城避坑指南和功略
推荐一篇Oracle RAC Cache Fusion的经典论文
"红警"游戏开源代码带给我们的震撼
文章分类和索引:
公众号1800篇文章分类和索引

文章转载自bisal的个人杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论