配置慢查询的触发规则
在 TiDB Cloud console 中,你可以在 Diagnosis 页面的 Slow Query 页签查看慢查询。
默认情况下,执行时间超过 300 毫秒的 SQL 查询会被视为慢查询。要配置慢查询的触发规则,你可以修改 tidb_slow_log_rules 系统变量。
tidb_slow_log_rules 支持多维度指标组合,适用于慢查询的“定向采样”和“问题复现”,使你能够基于特定指标组合筛选目标语句。
示例
标准格式(
SESSION作用域):SET SESSION tidb_slow_log_rules = 'Query_time: 0.5, Is_internal: false';无效的
SESSION规则(SESSION作用域不支持Conn_ID):SET SESSION tidb_slow_log_rules = 'Conn_ID: 12, Query_time: 0.5, Is_internal: false';
统一规则语法和类型约束
- 规则容量与分隔方式:每个支持的作用域最多可包含 10 条规则。规则之间使用
;分隔。 - 条件格式:每个条件使用
field_name:value格式。单条规则中的多个条件使用,分隔。 - 字段名不区分大小写。字段名中的下划线和其他字符会被保留。
TiDB Cloud Essential 和 TiDB Cloud Premium 仅支持 tidb_slow_log_rules 的 SESSION 规则。因此,仅在 GLOBAL 规则中可用的 Conn_ID 不受支持。
- 匹配语义:
- 除
Conn_ID外的数值字段使用>=进行匹配。Conn_ID、字符串字段和布尔字段使用相等匹配(=)。 DB和Resource_group的匹配不区分大小写。- 不支持显式运算符,例如
>、<和!=。
- 除
类型约束如下:
- 数值类型(
int64、uint64、float64)要求值大于或等于0。负值会导致解析错误。int64:最大值为2^63-1。uint64:最大值为2^64-1。float64:值必须是有限且非负的。最大值约为1.79e308。NaN以及Inf、-Inf等无穷值均无效,并会导致错误。
bool:支持true/false、1/0和t/f(不区分大小写)。string:当前不支持包含分隔符,(条件分隔符)或;(规则分隔符)的字符串,即使使用引号(单引号或双引号)也不支持。不支持转义。- 重复字段:如果同一字段在单条规则中被指定多次,则最后一次出现的值生效。
支持的字段
下表中的字段遵循统一规则语法和类型约束中描述的一般匹配和类型规则,除非另有说明。
生效行为与匹配顺序
- 设置
tidb_slow_log_rules会覆盖指定作用域中的现有规则,而不是追加新规则。 - 将
tidb_slow_log_rules设置为空字符串会清除指定作用域中的规则。 - 多条规则之间使用
OR组合,而单条规则中的多个字段条件之间使用AND组合。 - 如果你仍希望使用 SQL 执行时间作为写入慢查询日志的条件,请在规则中使用
Query_time,并注意其单位为秒。
TiDB Cloud Essential 和 TiDB Cloud Premium 仅支持 tidb_slow_log_rules 的 SESSION 规则。
- 如果当前会话存在任意
SESSION规则,则慢查询日志是否输出由规则匹配结果决定。 SHOW VARIABLES LIKE 'tidb_slow_log_rules'和SELECT @@SESSION.tidb_slow_log_rules返回SESSION规则文本;如果未设置,则返回空字符串。
建议
tidb_slow_log_rules旨在替代单一阈值方式。它支持多维度指标条件组合,从而能够更灵活、更细粒度地控制慢查询日志记录。在资源充足的测试环境中(1 个 TiDB 节点,16 个 CPU 核心、48 GiB 内存;3 个 TiKV 节点,每个节点 16 个 CPU 核心、48 GiB 内存),重复的 sysbench 测试表明:当多维度慢查询日志规则在 30 分钟内生成数百万条慢日志记录时,性能影响仍然较小。然而,当日志量达到数千万条时,TPS 会显著下降,延时也会明显增加。因此,如果业务负载较高,或者 CPU 和内存资源已接近上限,请谨慎配置
tidb_slow_log_rules,以避免因规则过宽而导致日志泛滥。