• 当前位置: 首 页 > 教育百科 > 学历/技能 > 正文

    mysql 快速定位cpu 占比过高的sql语句

    :2024年07月10日
    数据库福利社

    首先通过`top`或`pidstat`命令确定CPU使用率异常高的线程,然后查询`performance_schema`或`information_schema`中的线程信息,最后分析慢查询日志以定位问题。

    当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_current

    WHERE

    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.info

    FROM

    information_schema.PROCESSLIST a,

    performance_schema.threads b

    WHERE

    a.id = b.processlist_id

    AND b.thread_os_id = 10593;

    来源:https://mp.weixin.qq.com/s/7w8T6fzdcsFQwZzI-W-SXQ

    [编辑:王振袢 &发表于江苏]
    [我要纠错]

    来源:本文内容搜集或转自各大网络平台,并已注明来源、出处,如果转载侵犯您的版权或非授权发布,请联系小编,我们会及时审核处理。
    声明:江苏教育黄页对文中观点保持中立,对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,不对文章观点负责,仅作分享之用,文章版权及插图属于原作者。

    关键词: MySQL 数据库 使用率 异常 升高
    有价值
    0
    无价值
    0
    猜您喜欢
    最热文章

    暂不支持手机端,请登录电脑端访问

    正在加载验证码......

    请先完成验证