[MySQL FAQ]系列 — PROCESSLIST中哪些状态要引起关注

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: [MySQL FAQ]系列 — PROCESSLIST中哪些状态要引起关注

一般而言,我们在processlist结果中如果经常能看到某些SQL的话,至少可以说明这些SQL的频率很高,通常需要对这些SQL进行进一步优化。

今天我们要说的是,在processlist中,看到哪些运行状态时要引起关注,主要有下面几个(建议用版模式查看):

状态 建议
copy to tmp table

执行ALTER TABLE修改表结构时


建议:放在凌晨执行或者采用类似pt-osc工具

Copying to tmp table

拷贝数据到内存中的临时表,常见于GROUP BY操作时


建议:创建适当的索引

Copying to tmp table on disk

临时结果集太大,内存中放不下,需要将内存中的临时表拷贝到磁盘上,形成 #sql***.MYD、#sql***.MYI(在5.6及更高的版本,临时表可以改成InnoDB引擎了,可以参考选项default_tmp_storage_engine


建议:创建适当的索引,并且适当加大sort_buffer_size/tmp_table_size/max_heap_table_size

Creating sort index

当前的SELECT中需要用到临时表在进行ORDER BY排序


建议:创建适当的索引

Creating tmp table

创建基于内存或磁盘的临时表,当从内存转成磁盘的临时表时,状态会变成:Copying to tmp table on disk


建议:创建适当的索引,或者少用UNION、视图(VIEW)、子查询(SUBQUERY)之类的,确实需要用到临时表的时候,可以在session级临时适当调大 tmp_table_size/max_heap_table_size 的值

Reading from net

表示server端正通过网络读取客户端发送过来的请求


建议:减小客户端发送数据包大小,提高网络带宽/质量

Sending data

从server端发送数据到客户端,也有可能是接收存储引擎层返回的数据,再发送给客户端,数据量很大时尤其经常能看见备注:Sending Data不是网络发送,是从硬盘读取,发送到网络是Writing to net


建议:通过索引或加上LIMIT,减少需要扫描并且发送给客户端的数据量

Sorting result

正在对结果进行排序,类似Creating sort index,不过是正常表,而不是在内存表中进行排序



建议:创建适当的索引

statistics

进行数据统计以便解析执行计划,如果状态比较经常出现,有可能是磁盘IO性能很差


建议:查看当前io性能状态,例如iowait

Waiting for global read lock

FLUSH TABLES WITH READ LOCK整等待全局读锁


建议:不要对线上业务数据库加上全局读锁,通常是备份引起,可以放在业务低谷期间执行或者放在slave服务器上执行备份

Waiting for tables,Waiting for table flush

FLUSH TABLES, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE等需要刷新表结构并重新打开


建议:不要对线上业务数据库执行这些操作,可以放在业务低谷期间执行

Waiting for lock_type lock 等待各种类型的锁:• Waiting for event metadata lock• Waiting for global read lock• Waiting for schema metadata lock

• Waiting for stored function metadata lock

• Waiting for stored procedure metadata lock

• Waiting for table level lock

• Waiting for table metadata lock

• Waiting for trigger metadata lock

建议:比较常见的是上面提到的global read lock以及table metadata lock,建议不要对线上业务数据库执行这些操作,可以放在业务低谷期间执行。如果是table level lock,通常是因为还在使用MyISAM引擎表,赶紧转投InnoDB引擎吧,别再老顽固了


更多详情可参考官方手册:8.14.2 General Thread States 章节(http://dev.mysql.com/doc/refman/5.6/en/general-thread-states.html



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 存储 运维
FAQ系列 | MySQL DBA修炼秘籍
FAQ系列 | MySQL DBA修炼秘籍
114 0
|
SQL 关系型数据库 MySQL
mysql show processlist Time为负数的思考
mysql show processlist Time为负数的思考
163 0
mysql show processlist Time为负数的思考
|
存储 Oracle 关系型数据库
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
104 0
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
|
存储 关系型数据库 MySQL
FAQ系列 | MySQL索引之主键索引
FAQ系列 | MySQL索引之主键索引
154 0
|
SQL 缓存 固态存储
FAQ系列 | 是什么导致MySQL数据库服务器磁盘I/O高?
FAQ系列 | 是什么导致MySQL数据库服务器磁盘I/O高?
138 0
FAQ系列 | 是什么导致MySQL数据库服务器磁盘I/O高?
|
关系型数据库 MySQL 测试技术
[MySQL FAQ]系列 — 打开general log到底影响多大
[MySQL FAQ]系列 — 打开general log到底影响多大
125 0
[MySQL FAQ]系列 — 打开general log到底影响多大
|
存储 Oracle 关系型数据库
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
124 0
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
|
SQL 缓存 固态存储
FAQ系列 | 是什么导致MySQL数据库服务器磁盘I/O高?
FAQ系列 | 是什么导致MySQL数据库服务器磁盘I/O高?
136 0
FAQ系列 | 是什么导致MySQL数据库服务器磁盘I/O高?
|
关系型数据库 MySQL
MySQL:关于RR模式下insert..select sending data状态说明
MySQL:关于RR模式下insert..select sending data状态说明
128 0
|
存储 缓存 NoSQL
[MySQL FAQ]系列 — 从MyISAM转到InnoDB需要注意什么
[MySQL FAQ]系列 — 从MyISAM转到InnoDB需要注意什么
下一篇
无影云桌面