《MYSQL45讲》kill不掉的线程

kill query + 线程id :终止这个线程正在执行的语句

kill connection + 线程id :关闭这个线程的连接,也会先停止这个线程正在执行的语句。这个connection可以缺省。

本文讨论的情况是:使用了kill命令,却没有断开连接,show processlist命令执行结果中,被kill的线程显示killed,这个killed是什么意思?以及一些常见的命令误解

1.收到kill query命令后,线程会做什么?

1.MYSQL中有个处理的kill命令的线程,处理kill命令的线程首先会设置该线程的状态为KILL_QUERY

2.给该线程发送一个“你被kill了”的信号

一个语句的执行过程中有多处埋点,执行到埋点处就会判断自己的线程状态。

如果线程在等待某个资源,那这个等待必须是可以唤醒的,否则就无法到达埋点处。

执行kill query 线程id命令,处理kill命令的线程首先会设置该线程的状态为KILL_QUERY,然后给该线程发送一个信号,该线程收到信号后知道自己被kill了,如果正在锁等待,就停止等待。去处理这个KILL_QUERY状态。 如果不发信号,该线程就仍然在锁等待,不知道自己被kill了。

2.收到kill connection命令后,会发生什么?

1.将被kill线程的状态设置为Kill_Connection

2.关闭被kill线程的网络连接

3.由于最大并发线程数不够导致的新线程等待并且kill不掉

当线程数已经达到最大并发线程数(innodb_thread_concurrency),此时一个新的查询请求想进来,需要等待有空闲线程,所以会每隔10ms尝试进入一次,并没有去判断线程的状态,所以此时kill query这个线程是没用的,而kill connection是可以的,直接关闭网络连接,但是一查,该线程仍然在等待中,不过状态是KILLED,因为

如果一个线程的状态是KILL_CONNECTION,就会把Command列显示成Killed。

为什么这样设计,因为断开连接只是将客户端和服务端连接断开了,而服务端的线程还是存在的。

那么该线程什么时候才能停止呢?

答案是要等到该线程能够进入innodb时,才会判断出自己的状态是了KILL_QUERY或者KILL_CONNECTION,此时才会进入终止线程的逻辑。

4.由于耗时长导致的一段时间内线程kill不掉

情况1:大事务,被kill时要将前面的更改都回滚,耗时长。

情况2:大查询回滚。

情况3:DDL命令执行到最后时被kill。

关于客户端的3个误解

1.在一个查询语句长时间阻塞时,客户端直接执行ctrl+c可以终止这个线程吗?

是不可以的,执行ctrl+c时,是启动另一个线程向服务端发送kill query命令,而MYSQL是停等协议,也就是要等到客户端的操作只能影响你客户端的线程,你ctrl+c只是客户端线程终止,只是你客户端退出了,服务端的线程仍然在运行。

2.数据库的表特别多,客户端连接就会很慢

客户端连接服务端需要执行的步骤是TCP握手,用户账号密码校验,获取权限。

可以看出来与表的数量没有关系。

表越多连接越速度越慢的原因是

客户端在连接成功后,需要将“每个库有哪些表”存本地缓存,用于名称补全的。

使用-A可以取消掉这个操作。

3.-quick命令不会让服务端变快

MYSQL客户端发送请求后,接收服务端返回结果的方式有两种:

1.在本地开个缓存,先把结果存起来。

2.不缓存,读一个处理一个

默认是第一个,而使用-quick就算第2个设置。

如果不缓存,本地如果处理慢了,就会导致服务端的结果被阻塞(因为停等协议),就导致服务端变慢了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeFlow评分系统

C o d e F l o w CodeFlow CodeFlow rating体系: 参考文献: https://www.cnblogs.com/ruierqwq/p/17973570/cf-at-rating https://blog.csdn.net/CSDNhdlg/article/details/123729562 https://www.jianshu.com/p/1ae01cf56f0a?fromtimeline 1 1 1、段位…

IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发

对于新手学习SpringBoot开发,可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握,如果快速上手数据库开发,可以先按照本文介绍的方式使用JdbcTemplat…

html5多媒体标签

文章目录 HTML5新增多媒体标签详解&#xff1a;视频标签与音频标签视频标签<video>音频标签<audio>代码案例 HTML5新增多媒体标签详解&#xff1a;视频标签与音频标签 HTML5引入了多项新特性&#xff0c;其中多媒体标签的引入为网页开发带来了革命性的变化。这些标…

12、Linux系统的网络基本设置

查看网络接口信息ifconfig ip addr/ip a #简单查看网络接口信息 ifconfig #表示只显示当前活跃的设备接口信息 ifconfig -a #查看当前主机所有的&#xff08;all&#xff09;网络设备&#xff0c;包括未运行的设备。 如我们查看本机网卡ens33的…

PHP:通往动态Web开发世界的桥梁

PHP&#xff0c;全名为“PHP: Hypertext Preprocessor”&#xff0c;是世界上最流行的服务器端脚本语言之一。它是动态网站开发的中流砥柱&#xff0c;用于构建从简单博客到复杂企业级应用的各种网络平台。在这篇文章中&#xff0c;我们将详细探讨PHP的起源、核心功能、开发流程…

react 中 FC 模块作用

React.FC 是一个泛型类型&#xff0c;用于定义函数组件的类型 一、类型定义和代码可读性 1. 明确组件类型 使用React.FC定义一个组件时&#xff0c;使得组件的输入&#xff08;props&#xff09;和输出&#xff08;返回的 React 元素&#xff09;都有明确的类型定义。 impo…

【Qt 蓝牙服务器实现】

在 Qt 中实现一个蓝牙服务器可以使用 Qt Bluetooth 模块。下面是一个基本的蓝牙服务器示例,它能够接受来自客户端的连接。 首先,请确保你已经安装了 Qt Bluetooth 模块并在项目文件中包含了相关库。 1. 项目文件 (.pro) 配置 在项目文件中添加以下行,以确保包含 Qt Bluet…

RabbitMQ高效的消息队列中间件原理及实践

RabbitMQ&#xff1a;高效的消息队列中间件及其 PHP 实现 一、什么是 RabbitMQ&#xff1f; RabbitMQ 是一个开源的消息队列中间件&#xff0c;使用 Erlang 编写&#xff0c;遵循 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议。它的主要功能是提供一种…

JDK1.8升级JDK不生效

最近因为项目原因&#xff0c;需要将jdk1.8升级到JDK11.升级发生了一个纠结的问题&#xff0c;就是cmd不生效。在此记录&#xff01; 项目中指定jdk 如果在android studio项目&#xff0c;可以单独指定该项目的jdk&#xff0c;而不用全局升级&#xff0c;可以做如下配置&#…

如何抓住鸿蒙生态崛起的机遇,解决开发挑战,创造更好的应用体验?

一、抓住鸿蒙生态崛起的机遇 深入了解鸿蒙系统的特性和优势 鸿蒙系统采用了全新的技术框架和编程语言ArkTS&#xff0c;具备高性能、高安全性和高弹性等特点。开发者需要熟悉这些特性&#xff0c;以便在开发过程中充分利用鸿蒙系统的优势。鸿蒙系统支持全场景打通、资源能力共享…

AI电商的创新应用

在AI技术的加持下&#xff0c;电商平台可以在购物推荐、会员分类、商品定价等方面实现创新应用&#xff0c;从而显著提高销售效率和用户体验。以下是如何具体运用AI技术来达成这些目标的详细阐述&#xff0c;以及为电商行业数字化转型提供的新思路和方法。 一、AI在购物推荐方…

八 Bean的生命周期

八、Bean的生命周期 8.1 什么是Bean的生命周期 Spring其实就是一个管理Bean对象的工厂。它负责对象的创建&#xff0c;对象的销毁等。 所谓的生命周期就是&#xff1a;对象从创建开始到最终销毁的整个过程。 什么时候创建Bean对象&#xff1f; 创建Bean对象的前后会调用什…

Javascript 笔记(二):闭包(2)与map知识点

需求 要写一个闹钟控件&#xff0c;分为小时和分钟两个部分。两个部分的逻辑是一样的&#xff0c;只有域不同所以为了提高代码利用率&#xff0c;就使用闭包来完成。 问题 function loop_tuple(){let index 0return function(tuple){index(index1)%3return tuple[index]} }…

RK3568硬解码并与Qt界面融合显示深入探究

1. 最近实在头疼&#xff0c;因为项目换了平台。折腾来折腾去&#xff0c;到今天算是把很多坑踩完了。 RK上实现硬解码方案一共有一下几种方式 1&#xff09;opencvgstreamer插件&#xff0c;采用硬解码&#xff0c;只能解码出图像&#xff0c;无法解出声音 2&#xff09;ff…

【Android】webview常用方法和使用

文章目录 前言一、常见用法二、基础属性webView的常用方法WebViewClient的常用方法WebChromeClient的常用方法WebSettings的相关方法 三、加载流程和事件回调四、webview和JS之间的互相调用总结 五、参考链接 前言 最近项目又用到了webview&#xff0c;在回顾复习一次webview相…

django博客项目实现站内搜索功能

Django博客站内搜索功能实现 1. 准备工作 确保Django项目已经创建好&#xff0c;并且有一个用于存储博客文章的模型&#xff08;例如Post&#xff09;。 2. 定义搜索表单 在应用目录下创建一个forms.py文件&#xff0c;定义一个搜索表单。 from django import formsclass …

OpenGL ES 共享上下文实现多线程渲染

OpenGL ES 共享上下文时,可以共享哪些资源? 共享上下文实现多线程渲染 EGL 概念回顾 EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信; 查询绘图表面的可用类型和配置; 创建绘图表面; 在OpenGL ES 和…

0087__DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区

DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区-CSDN博客

09C++结构体

/*结构体属于用户自定义的数据类型&#xff0c; 允许用户存储不同的数据类型, 语法:struct 结构体名{结构体成员列表} ;*/ //struct 结构体名 变量名 #include <iostream> #include <string> using namespace std; struct student { string name; int age;int s…

python第七次作业

01.设计一个函数&#xff0c;可以传入一个或多个单词的字符串&#xff0c;并返回该字符串&#xff0c;但所有五个或更多字母的单词都前后颠倒 a input("输入:") print(a) #将一句话以空格为分界拆分为单个单词 b a.split(" ") ls_1 [] ls_2 []for i i…