首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL中KILL指令的工作原理讲解

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

作者头像
bisal
发布2025-11-12 17:30:30
发布2025-11-12 17:30:30
1410
举报

技术社群的这篇文章《图解 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() 检查线程是否应该终止:

代码语言:javascript
复制
bool Sql_data_context::is_killed() const {
  const auto kill = thd_killed(get_thd());
  DBUG_LOG("debug", "is_killed:" << kill);
  if (0 == kill) return false;
  return ER_QUERY_INTERRUPTED != kill;
}

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

结论

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bisal的个人杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MySQL 函数:is_killed()
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档