1.show processlist;
MySQL在使用过程中遇到访问速度慢,或者无法响应这类的问题,解决方式基本都有定式,一般第一反应都会是登录到MySQL, 执行show processlist看看当前连接状态。
这个命令是跟navicat的工具栏的服务器监控的监控页面一样。
字段解析:
id: 一个标识,你要kill 一个语句的时候很有用。
user: 显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。
host: 显示这个语句是从哪个ip 的哪个端口上发出的。
db: 显示这个进程目前连接的是哪个数据库。
command: 显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。
通常表示资源未释放,如果是通过连接池,sleep状态数量应该恒定在一定数量范围内。
time: 此这个状态持续的时间,单位是秒。
info: 显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。
state: 显示使用当前连接的sql语句的状态。state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成。
state状态的几种值:
Checking table 正在检查数据表,这是自动的。
Closing tables 正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作。
Connect Out 复制从服务器正在连接主服务器。
Copying to tmp table on disk 由于临时结果集大于 tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。索引及现有结构无法涵盖查询条件,才会建立一个临时表来满足查询要求,产生巨大的恐怖的i/o压力。很可怕的搜索语句会导致这样的情况,如果是数据分析,或者半夜的周期数据清理任务,偶尔出现,可以允许。频繁出现务必优化之。
Creating tmp table 正在创建临时表以存放部分查询结果。
deleting from main table 服务器正在执行多表删除中的第一部分,刚删除第一个表。
deleting from reference tables 服务器正在执行多表删除中的第二部分,正在删除其他表的记录。
Flushing tables 正在执行 FLUSH TABLES,等待其他线程关闭数据表。
Killed 发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。
Locked 被其他查询锁住了。(重要,找到正在执行持有锁的语句然后kill掉可以让这个进程进行下去)
Updating 正在搜索匹配的记录,并且修改它们。
Sending data 正在处理 SELECT 查询的记录,同时正在把结果发送给客户端。 Sending data并不是发送数据,别被这个名字所欺骗,这是从物理磁盘获取数据的进程,如果你的影响结果集较多,那么就需要从不同的磁盘碎片去抽取数据。如果sending data连接过多,通常是某查询的影响结果集过大,也就是查询的索引项不够优化。如果出现大量相似的SQL语句出现在show proesslist列表中,并且都处于sending data状态,优化查询索引,记住用影响结果集的思路去思考。(结果集过多)
show processlist这个语句不能加where条件,可以通过
SELECT *
FROM information_schema.processlist
WHERE state ='Locked';
加where条件查询,字段跟show processlist的显示字段一致。