diff --git a/system-variable-reference.md b/system-variable-reference.md index e5838d4a58ae..b7a2806a0978 100644 --- a/system-variable-reference.md +++ b/system-variable-reference.md @@ -3992,6 +3992,13 @@ summary: 查看 TiDB 所有的系统变量,以及引用这些变量的文档 - [TiDB 7.1.6 Release Notes](/releases/release-7.1.6.md) - [TiDB 6.5.0 Release Notes](/releases/release-6.5.0.md) +### tidb_ttl_enable_index_scan + +引用该变量的文档: + +- [使用 TTL (Time to Live) 定期删除过期数据](/time-to-live.md) +- [系统变量](/system-variables.md#tidb_ttl_enable_index_scan) + ### tidb_ttl_job_enable 引用该变量的文档: diff --git a/system-variables.md b/system-variables.md index 01ab57207cee..e73f51df3161 100644 --- a/system-variables.md +++ b/system-variables.md @@ -5835,6 +5835,15 @@ Query OK, 0 rows affected, 1 warning (0.00 sec) - 范围:`[1, 256]` - 这个变量用于设置每个 TiDB 节点上 TTL 删除任务的最大并发数。更多信息,请参考 [Time to Live](/time-to-live.md)。 +### `tidb_ttl_enable_index_scan` + +- 作用域:GLOBAL +- 是否持久化到集群:是 +- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 +- 默认值:`ON` +- 类型:布尔型 +- 这个变量用于控制 TTL 任务是否可以使用以 TTL 列开头且符合条件的二级索引或非聚簇主键索引。设置为 `OFF` 时,TTL 任务按照表键顺序扫描。有关索引适用条件,请参考[使用索引扫描过期行](/time-to-live.md#使用索引扫描过期行)。 + ### `tidb_ttl_job_enable` 从 v6.5.0 版本开始引入 - 作用域:GLOBAL diff --git a/time-to-live.md b/time-to-live.md index be5496401307..a8fed3720b48 100644 --- a/time-to-live.md +++ b/time-to-live.md @@ -140,6 +140,23 @@ ALTER TABLE orders TTL_JOB_INTERVAL = '48h'; TiDB 还会在集群级别限制并发执行的 TTL 子任务数量。你可以通过修改系统变量 [`tidb_ttl_running_tasks`](/system-variables.md#tidb_ttl_running_tasks-从-v700-版本开始引入) 来设置最大并发数量。 +### 使用索引扫描过期行 + +要使用索引扫描,TTL 列必须是索引的第一列。这样,TiDB 可以直接扫描可能包含过期行的索引范围,而不必扫描尚未过期的索引项。 + +默认情况下,TiDB 会自动选择一个符合条件的索引进行扫描。该行为由全局变量 [`tidb_ttl_enable_index_scan`](/system-variables.md#tidb_ttl_enable_index_scan) 控制,默认开启。当关闭该变量或没有符合条件的索引时,TiDB 会回退到按照表键顺序扫描,并阻止优化器为该扫描选择二级索引。对于使用聚簇主键的表,表键扫描会使用该聚簇主键。 + +除 TTL 列位于首位外,符合条件的索引还必须满足以下要求: + +- 索引是可见的二级索引或非聚簇主键索引,且不是部分索引、全局索引、多值索引、向量搜索索引或全文索引。 +- 每个索引列均索引完整的列值,不能使用前缀索引或表达式索引。 +- 对于包含多列的唯一索引,除 TTL 列之外的其他列都为 `NOT NULL`。 +- 非唯一索引满足以下要求: + - 索引包含全部主键列或完全不包含主键列,不能只包含复合主键中的部分列。 + - 如果表的聚簇主键由单个无符号整数列组成,索引必须包含该主键列。 + - 如果聚簇主键中的任意列指定了前缀长度,索引必须包含全部主键列。 +- 索引列不能是 `SET`、`FLOAT` 或 `DOUBLE` 类型。对于不包含主键列的非唯一索引,主键列也不能是这些类型。 + 如果想禁止 TTL 任务的执行,除了可以设置表属性 `TTL_ENABLE='OFF'` 外,也可以通过设置全局变量 `tidb_ttl_job_enable` 关闭整个集群的 TTL 任务的执行。 ```sql @@ -193,7 +210,7 @@ TiDB 会定时采集 TTL 的运行时信息,并在 Grafana 中提供了相关 列 `{last, current}_job_{start_time, finish_time, ttl_expire}` 分别描述了过去和当前 TTL 任务的开始时间、结束时间和过期时间。`last_job_summary` 列描述了上一次 TTL 任务的执行情况,包括总行数、成功行数、失败行数。 -+ `mysql.tidb_ttl_task` 表中包含了正在执行的 TTL 子任务。单个 TTL 任务会被拆分为多个子任务,该表中记录了正在执行的这些子任务的信息。 ++ `mysql.tidb_ttl_task` 表中包含了正在执行的 TTL 子任务。单个 TTL 任务会被拆分为多个子任务,该表中记录了正在执行的这些子任务的信息。`scan_index_id` 列表示创建任务时选择的扫描路径。非 `NULL` 值是所选索引的 ID,`NULL` 表示该子任务按照表键顺序扫描。 + `mysql.tidb_ttl_job_history` 表中记录了 TTL 任务的执行历史。TTL 任务的历史记录将被保存 90 天。以一行为例: ```sql