暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

在mysql的环境中定位cpu 占比过高的sql语句

watson 2024-08-13
121

当MySQL数据库的CPU使用率异常升高时,定位导致问题的SQL语句可以通过以下步骤进行:


1. **使用`top`或`pidstat`命令**:

   首先,可以通过`top -H -p <mysqld进程id>`或者`pidstat -t -p <mysqld进程id> 1 5`命令来确定哪个线程占用了大量的CPU资源。


2. **查询`performance_schema`或`information_schema`**:

   使用以下SQL语句可以查询到具体的线程信息,包括其操作系统线程ID(`THREAD_OS_ID`)和正在执行的SQL语句:

   ```sql

 SELECT      a.THREAD_OS_ID,     b.id,     b.USER,     b.HOST,     b.db,     b.PROCESSLIST_INFO,     b.INFO   FROM      PERFORMANCE_SCHEMA.THREADS a,     information_schema.PROCESSLIST b   WHERE      b.id = a.processlist_id AND a.THREAD_OS_ID = <具体线程id>;

   ```

   其中 `<具体线程id>` 是从步骤1中获取的线程ID。


3. **分析慢查询日志**:

   开启MySQL的慢查询日志,分析执行时间过长的SQL语句。可以通过以下命令查看慢查询日志的配置:

   ```sql

   SHOW VARIABLES LIKE 'slow_query_log%';

   ```

   然后使用`explain`分析慢查询日志中记录的SQL语句,找出可能的性能瓶颈。


4. **使用`SHOW PROCESSLIST`命令**:

   登录到MySQL服务器,使用`SHOW FULL PROCESSLIST;`命令查看当前正在执行的所有线程,包括它们的状态和执行时间。这有助于识别长时间运行的查询。


5. **使用`SHOW PROFILE`或`SHOW PROFILES`**:

   对于短时间执行但CPU使用率高的SQL,可以使用`SHOW PROFILE`或`SHOW PROFILES`来获取SQL语句的详细性能数据。


6. **检查`information_schema`中的`processlist`表**:

   通过以下命令查询`processlist`表,找到CPU使用率高的线程:

   ```sql

   SELECT * FROM performance_schema.threads WHERE thread_os_id = '1';

   ```

   这将显示与特定操作系统线程ID相关联的MySQL线程的详细信息。


7. **使用通用日志记录**:

   如果需要,可以开启MySQL的通用日志记录功能,记录所有执行的SQL语句,以便进行分析:

   ```sql

   SET GLOBAL log_output='TABLE';

   SET GLOBAL general_log=ON;

   ```

   然后通过查询`mysql.general_log`表来查看日志记录的SQL语句。


通过这些步骤,你可以定位到导致CPU使用率高的SQL语句,并进一步分析和优化它们以降低资源消耗。


下面使用方案二来演示定位SQL

1:top查看

图片

2:top -Hp 42977

图片


3: 带入下面的脚本

SELECT    *FROM    performance_schema.events_statements_currentWHERE    thread_id = (        SELECT            thread_id        FROM            performance_schema.threads        WHERE            thread_os_id = 10593    ) ;

图片

SELECT    a. USER,    a. HOST,    a.db,    b.thread_os_id,    b.thread_id,    a.id processlist_id,    a.command,    a.time,    a.state,    a.infoFROM    information_schema.PROCESSLIST a,    performance_schema.threads bWHERE    a.id = b.processlist_idAND b.thread_os_id = 10593;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论