全部产品
Search
文档中心

查询慢SQL记录

更新时间: 2020-08-07

DRDS将执行时间超过1秒的SQL定义为慢SQL。DRDS中的慢SQL包括逻辑慢SQL和物理慢SQL。

  • 逻辑慢SQL:应用发送到DRDS的慢SQL。
  • 物理慢SQL:DRDS发送到RDS的慢SQL。

每个DRDS节点最多保存5000条慢SQL记录,超过限制数量的慢SQL明细会被滚动删除。

语法

  1. SHOW FULL {SLOW | PHYSICAL_SLOW} [WHERE where_condition]
  2. [ORDER BY col_name [ASC | DESC], ...]
  3. [LIMIT {[offset,] row_count | row_count OFFSET offset}]

解释

  • SHOW FULL SLOW显示的是逻辑慢SQL,即应用发送到DRDS的SQL。
    其结果集的各列含义如下:

    • TRACE_ID:该SQL的唯一标记,同一个逻辑SQL以及该逻辑SQL产生的物理SQL的TRACE_ID相同,同时TRACE_ID也会以注释的形式发送到RDS,在RDS的SQL明细中可以根据TRACE_ID找到该SQL。
    • HOST:发送该SQL的客户端的IP,注意:在VPC模式下可能无法获取客户端IP。
    • START_TIME:DRDS收到这个SQL的时间。
    • EXECUTE_TIME:DRDS执行该SQL消耗的时间。
    • AFFECT_ROW:该SQL返回的记录数或者影响的行数。
    • SQL:执行的语句。
  • SHOW FULL PHYSICAL_SLOW指的是物理慢SQL,即DRDS发送到RDS(MySQL)的SQL。
    其结果集的各列含义如下:

    • TRACE_ID:该SQL的唯一标记,同一个逻辑SQL以及该逻辑SQL产生的物理SQL的TRACE_ID相同,同时TRACE_ID也会以注释的形式发送到RDS,在RDS的SQL明细中可以根据TRACE_ID找到该SQL。
    • GROUP_NAME:数据库分组名,分组的目标是管理多组数据完全相同的数据库,比如通过RDS(MySQL)进行数据复制后的主备数据库,主要用来解决读写分离,主备切换的问题。
    • DBKEY_NAME:执行的分库信息。
    • START_TIME:DRDS开始执行这个SQL的时间。
    • EXECUTE_TIME:DRDS执行该SQL消耗的时间。
    • SQL_EXECUTE_TIME:DRDS调用RDS执行该SQL消耗的时间。
    • GETLOCK_CONNECTION_TIME:DRDS从连接池获取连接消耗的时间,该值如果很大,说明RDS的连接已被耗尽,一般是慢SQL比较多引起,登录到相应的RDS,结合SHOW PROCESSLIST指令来排查。
    • CREATE_CONNECTION_TIME:DRDS建立RDS连接消耗的时间,该值如果很大,很大原因是底层的RDS压力比较大或者挂掉了。
    • AFFECT_ROW:该SQL返回的记录数或者影响的行数。
    • SQL:执行的语句。

使用示例

大部分情况下,DRDS都能以令人满意的方式将SQL下推到MySQL,如果发现慢SQL,有可能是因为物理SQL慢导致的。通过查询逻辑和物理慢SQL日志,可以帮助我们找到问题的原因。

示例一:在DRDS上定位到慢SQL,如何找到相应的物理慢SQL?

  1. 通过一些条件,例如执行时间,SQL字符串匹配等方式来获取我们想要的慢SQL。

    1. mysql> show full slow where `SQL` like '%select sleep(50)%';
    2. +-----------------+-----------+-------------------------+--------------+------------+------------------+
    3. | TRACE_ID | HOST | START_TIME | EXECUTE_TIME | AFFECT_ROW | SQL |
    4. +-----------------+-----------+-------------------------+--------------+------------+------------------+
    5. | ae0e565b8c00000 | 127.0.0.1 | 2017-03-29 19:28:43.028 | 50009 | 1 | select sleep(50) |
    6. +-----------------+-----------+-------------------------+--------------+------------+------------------+
    7. 1 row in set (0.02 sec)
  2. 根据逻辑慢SQL中获取到的TRACE_ID,执行SHOW FULL PHYSICAL_SLOW指令获取这个SQL的物理执行情况;

    1. mysql> show full physical_slow where trace_id = 'ae0e565b8c00000';
    2. +-----------------+----------------------------------------------------+-----------------------------------------------+------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    3. | TRACE_ID | GROUP_NAME | DBKEY_NAME | START_TIME | EXECUTE_TIME | SQL_EXECUTE_TIME | GETLOCK_CONNECTION_TIME | CREATE_CONNECTION_TIME | AFFECT_ROW | SQL |
    4. +-----------------+----------------------------------------------------+-----------------------------------------------+------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    5. | ae0e565b8c00000 | PRIV_TEST_1489167306631PJAFPRIV_TEST_APKK_0000_RDS | rdso6g5b6206sdq832ow_priv_test_apkk_0000_nfup | 2017-03-29 19:27:53.02 | 50001 | 50001 | 0 | 0 | 1 | select sleep(50) |
    6. +-----------------+----------------------------------------------------+-----------------------------------------------+------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    7. 1 row in set (0.01 sec)
  3. 可以在RDS的SQL明细与慢SQL中,根据这个TRACE_ID查看这个SQL在RDS上的执行情况。

示例二:在RDS中找到一个慢SQL,如何找到DRDS中的原始SQL?

  1. 在RDS的管理控制台 -> 日志管理 -> 慢SQL明细页面中,观察到慢SQL的TRACE_ID为 ae0e55660c00000。

  2. 根据第一步获取到的TRACE_ID,执行SHOW FULL PHYSICAL_SLOW指令获取这个SQL的物理执行情况;

    1. mysql> show full physical_slow where trace_id = 'ae0e55660c00000';
    2. +-----------------+----------------------------------------------------+-----------------------------------------------+-------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    3. | TRACE_ID | GROUP_NAME | DBKEY_NAME | START_TIME | EXECUTE_TIME | SQL_EXECUTE_TIME | GETLOCK_CONNECTION_TIME | CREATE_CONNECTION_TIME | AFFECT_ROW | SQL |
    4. +-----------------+----------------------------------------------------+-----------------------------------------------+-------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    5. | ae0e55660c00000 | PRIV_TEST_1489167306631PJAFPRIV_TEST_APKK_0000_RDS | rdso6g5b6206sdq832ow_priv_test_apkk_0000_nfup | 2017-03-29 19:27:37.308 | 10003 | 10001 | 0 | 0 | 1 | select sleep(10) |
    6. +-----------------+----------------------------------------------------+-----------------------------------------------+-------------------------+--------------+------------------+-------------------------+------------------------+------------+------------------+
    7. 1 row in set (0.02 sec)