MySQL-31:Kill语句

在MysQL中存在两个kill语句,如下:

  • kill query + 线程id:表示终止这个线程正在执行的语句
  • kill conection + 线程id,conection可以缺省:表示断开这个线程的连接

在正常情况,执行kill query会停止请求;执行kill conection 会停止连接,如下图,就是能很顺人意地终止请求。
在这里插入图片描述

31.1执行kill后,线程做什么

现假设一个请求申请并拥有MDL锁,我们将它kill掉,那它是不是应该将MDL锁释放掉?
kiil命令的意思并不是立即杀死线程或者请求,而是告知这些请求/线程不需要继续执行了,结束吧。

它会想Linux一样,给相应的进程发一个信号,告诉他们结束了,但他们并不会立刻结束,而是会继续执行,直到发现了这个信号,
实现上,当用户执行 kill query thread_id_B 时,MySQL 里处理 kill 命令的线程做了两件事:

  • 把 session B 的运行状态改成 THD::KILL_QUERY(将变量 killed 赋值为 THD::KILL_QUERY);
  • 给 session B 的执行线程发一个信号。

这其实也有点像Java中的线程中断,给线程上状态,具体什么中断就看线程什么时候会检测到这个状态,然后再挂起。

例如,如下,就是一个kill不掉的例子,它其实是需要时间,需要给它运行的时间来处理它停机之前的后事。
在这里插入图片描述
但实际上,执行kill conection也并不会立刻处理掉这个线程,它该怎样还是得怎样,直到有机会去料理它断线之前的事。

当 session E 执行 kill connection 命令时,

  • 把 12 号线程状态设置为 KILL_CONNECTION;
  • 关掉 12 号线程的网络连接。因为有这个操作,所以你会看到,这时候 session C 收到了断开连接的提示。

这样也就是说,我们通过show processlist命令来查看线程状态时,它会在里面,不过线程状态为killed。

32.2 拓展点

当表过多,MySQL端连接就会很慢:

当MySQL在进行数据库连接的时候,MySQL客户端会提供一个库名和表名自动补全的功能,但是这需要数据支持啊,所以这个功能就是放在数据连接的时候来实现。

自动补全功能:表名或者库名的前缀,按下tab键就会进行补全。
在这里插入图片描述
它会执行如下操作:

  1. 执行 show databases;
  2. 切到 db1 库,执行 show tables;
  3. 把这两个命令的结果用于构建一个本地的哈希表。

也即是说慢是慢在了哈希表的构建上面,而是不是连接性能问题。在执行命令的后面加上-A,,就会直接返回,不进行这一步。

另一个参数-quick:在处理请求时,MySQL默认是在客户端有一个缓存,也就是本地缓存,但是如果你要是添加了quick参数,就会采用不缓存的方式,读一个处理一个。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值