TiDB 专用系统变量和语法

TiDB 在 MySQL 的基础上,定义了一些专用的系统变量和语法用来优化性能。

系统变量

变量可以通过 SET 语句设置,例如

set @@tidb_distsql_scan_concurrency = 10

如果需要设值全局变量,执行

set @@global.tidb_distsql_scan_concurrency = 10

tidb_snapshot

作用域: SESSION

默认值: 空字符串

这个变量用来设置当前会话期待读取的历史数据所处时刻。比如当设置为 “2017-11-11 20:20:20” 时或者一个 TSO 数字 “400036290571534337”,当前会话将能读取到该时刻的数据。

tidb_import_data

作用域: SESSION

默认值: 0

这个变量用来表示当前状态是否为从 dump 文件中导入数据。 当这个变量被设置为 1 时,唯一索引约束不被检查以加速导入速度。 这个变量不对外用,只是给 lightning 使用,请用户不要自行修改。

tidb_opt_agg_push_down

作用域: SESSION

默认值: 0

这个变量用来设置优化器是否执行聚合函数下推到 Join 之前的优化操作。 当查询中聚合操作执行很慢时,可以尝试设置该变量为 1。

tidb_opt_insubquery_unfold

作用域: SESSION | GLOBAL

默认值: 0

这个变量用来设置优化器是否执行 in-子查询展开的优化操作。

tidb_build_stats_concurrency

作用域: SESSION

默认值: 4

这个变量用来设置 ANALYZE 语句执行时并发度。 当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。

tidb_checksum_table_concurrency

作用域: SESSION

默认值: 4

这个变量用来设置 ADMIN CHECKSUM TABLE 语句执行时扫描索引的并发度。 当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。

tidb_current_ts

作用域: SESSION

默认值: 0

这个变量是一个只读变量,用来获取当前事务的时间戳。

tidb_config

作用域: SESSION

默认值: 空字符串

这个变量是一个只读变量,用来获取当前 TiDB Server 的配置信息。

tidb_distsql_scan_concurrency

作用域: SESSION | GLOBAL

默认值: 15

这个变量用来设置 scan 操作的并发度,AP 类应用适合较大的值,TP 类应用适合较小的值。 对于 AP 类应用,最大值建议不要超过所有 TiKV 节点的 CPU 核数。

tidb_index_lookup_size

作用域: SESSION | GLOBAL

默认值: 20000

这个变量用来设置 index lookup 操作的 batch 大小,AP 类应用适合较大的值,TP 类应用适合较小的值。

tidb_index_lookup_concurrency

作用域: SESSION | GLOBAL

默认值: 4

这个变量用来设置 index lookup 操作的并发度,AP 类应用适合较大的值,TP 类应用适合较小的值。

tidb_index_lookup_join_concurrency

作用域: SESSION | GLOBAL

默认值: 4

这个变量用来设置 index lookup join 算法的并发度。

tidb_hash_join_concurrency

作用域: SESSION | GLOBAL

默认值: 5

这个变量用来设置 hash join 算法的并发度。

tidb_index_serial_scan_concurrency

作用域:SESSION | GLOBAL

默认值:1

这个变量用来设置顺序 scan 操作的并发度,AP 类应用适合较大的值,TP 类应用适合较小的值。

tidb_projection_concurrency

作用域:SESSION | GLOBAL

默认值:4

这个变量用来设置 Projection 算子的并发度。

tidb_hashagg_partial_concurrency

作用域:SESSION | GLOBAL

默认值:4

这个变量用来设置并行 hash aggregation 算法 partial 阶段的执行并发度。对于聚合函数参数不为 distinct 的情况,HashAgg 分为 partial 和 final 阶段分别并行执行。

tidb_hashagg_final_concurrency

作用域:SESSION | GLOBAL

默认值:4

这个变量用来设置并行 hash aggregation 算法 final 阶段的执行并发度。对于聚合函数参数不为 distinct 的情况,HashAgg 分为 partial 和 final 阶段分别并行执行。

tidb_index_join_batch_size

作用域:SESSION | GLOBAL

默认值:25000

这个变量用来设置 index lookup join 操作的 batch 大小,AP 类应用适合较大的值,TP 类应用适合较小的值。

tidb_skip_utf8_check

作用域: SESSION | GLOBAL

默认值: 0

这个变量用来设置是否跳过 UTF-8 字符的验证。 验证 UTF-8 字符需要消耗一定的性能,当可以确认输入的字符串为有效的 UTF-8 字符时,可以将其设置为 1。

tidb_max_chunk_size

作用域: SESSION | GLOBAL

默认值: 1024

这个变量用来设置执行过程中一个 chunk 最大的行数。

tidb_mem_quota_query

作用域:SESSION

默认值:32 GB

这个变量用来设置一条查询语句的内存使用阈值。 如果一条查询语句执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。

tidb_mem_quota_hashjoin

作用域:SESSION

默认值:32 GB

这个变量用来设置 HashJoin 算子的内存使用阈值。 如果 HashJoin 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。

tidb_mem_quota_mergejoin

作用域:SESSION

默认值:32 GB

这个变量用来设置 MergeJoin 算子的内存使用阈值。 如果 MergeJoin 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。

tidb_mem_quota_sort

作用域:SESSION

默认值:32 GB

这个变量用来设置 Sort 算子的内存使用阈值。 如果 Sort 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。

tidb_mem_quota_topn

作用域:SESSION

默认值:32 GB

这个变量用来设置 TopN 算子的内存使用阈值。 如果 TopN 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。

tidb_mem_quota_indexlookupreader

作用域:SESSION

默认值:32 GB

这个变量用来设置 IndexLookupReader 算子的内存使用阈值。

如果 IndexLookupReader 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。

tidb_mem_quota_indexlookupjoin

作用域:SESSION

默认值:32 GB

这个变量用来设置 IndexLookupJoin 算子的内存使用阈值。 如果 IndexLookupJoin 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。

tidb_mem_quota_nestedloopapply

作用域:SESSION

默认值:32 GB

这个变量用来设置 NestedLoopApply 算子的内存使用阈值。 如果 NestedLoopApply 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。

tidb_general_log

作用域:SERVER

默认值:0

这个变量用来设置是否在日志里记录所有的 SQL 语句。

tidb_enable_streaming

作用域:SESSION

默认值:0

这个变量用来设置是否启用 Streaming。

tidb_retry_limit

作用域:SESSION | GLOBAL

默认值:10

这个变量用来设置最多可重试次数, 即在一个事务执行中遇到可重试的错误(例如事务冲突、TiKV 繁忙等)时,这个事务可以被重新执行,这个变量值表明最多可重试的次数。

tidb_disable_txn_auto_retry

作用域:SESSION | GLOBAL

默认值:0

这个变量用来设置是否禁用显式事务自动重试,设置为 1 时,不会自动重试,如果遇到冲突需要在应用层重试。 是否需要禁用自动重试,请参考自动重试的风险

tidb_enable_table_partition

作用域:SESSION

默认值:0

这个变量用来设置是否开启 TABLE PARTITION 特性。

tidb_backoff_lock_fast

作用域:SESSION | GLOBAL

默认值:100

这个变量用来设置读请求遇到锁的 backoff 时间。

tidb_ddl_reorg_worker_cnt

作用域: GLOBAL

默认值:16

这个变量用来设置 DDL 操作 re-organize 阶段的并发度。

tidb_ddl_reorg_batch_size

作用域: GLOBAL

默认值:1024

这个变量用来设置 DDL 操作 re-organize 阶段的 batch size。比如 Add Index 操作,需要回填索引数据,通过并发 tidb_ddl_reorg_worker_cnt 个 worker 一起回填数据,每个 worker 是以 batch 为单位进行回填。如果 Add Index 时有较多 Update 操作或者 Replace 等更新操作,batch size 越大,事务冲突的概率也会越大,此时建议调小 batch size 的值,最小值是 32。在没有事务冲突的情况下,batch size 可设为较大值,最大值是 10240,这样回填数据的速度更快,但是 TiKV 的写入压力也会变大。

tidb_ddl_reorg_priority

作用域:SESSION | GLOBAL

默认值:PRIORITY_LOW

这个变量用来设置 ADD INDEX 操作 re-organize 阶段的执行优先级,可设置为 PRIORITY_LOW/PRIORITY_NORMAL/PRIORITY_HIGH。

tidb_force_priority

作用域:SESSION

默认值:NO_PRIORITY

这个变量用于改变 TiDB server 上执行的语句的默认优先级。例如,你可以通过设置该变量来确保正在执行 OLAP 查询的用户优先级低于正在执行 OLTP 查询的用户。

可设置为 NO_PRIORITYLOW_PRIORITYDELAYEDHIGH_PRIORITY

Optimizer Hints

TiDB 支持 Optimizer Hints 语法,它基于 MySQL 5.7 中介绍的类似 comment 的语法,例如 /*+ TIDB_XX(t1, t2) */。当 TiDB 优化器选择的不是最优查询计划时,建议使用 Optimizer Hints。

注意:

MySQL 命令行客户端在 5.7.7 版本之前默认清除了 Optimizer Hints。如果需要在这些早期版本的客户端中使用 Hint 语法,需要在启动客户端时加上 --comments 选项,例如 mysql -h 127.0.0.1 -P 4000 -uroot --comments

TIDB_SMJ(t1, t2)

SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1t2 where t1.id = t2.id

提示优化器使用 Sort Merge Join 算法,这个算法通常会占用更少的内存,但执行时间会更久。 当数据量太大,或系统内存不足时,建议尝试使用。

TIDB_INLJ(t1, t2)

SELECT /*+ TIDB_INLJ(t1, t2) */ * from t1t2 where t1.id = t2.id

提示优化器使用 Index Nested Loop Join 算法,这个算法可能会在某些场景更快,消耗更少系统资源,有的场景会更慢,消耗更多系统资源。对于外表经过 WHERE 条件过滤后结果集较小(小于 1 万行)的场景,可以尝试使用。TIDB_INLJ() 中的参数是建立查询计划时,内表的候选表。即 TIDB_INLJ(t1) 只会考虑使用 t1 作为内表构建查询计划。

TIDB_HJ(t1, t2)

SELECT /*+ TIDB_HJ(t1, t2) */ * from t1t2 where t1.id = t2.id

提示优化器使用 Hash Join 算法,这个算法多线程并发执行,执行速度较快,但会消耗较多内存。

SHARD_ROW_ID_BITS

对于 PK 非整数或没有 PK 的表,TiDB 会使用一个隐式的自增 rowid,大量 INSERT 时会把数据集中写入单个 Region,造成写入热点。

通过设置 SHARD_ROW_ID_BITS,可以把 rowid 打散写入多个不同的 Region,缓解写入热点问题。但是设置的过大会造成 RPC 请求数放大,增加 CPU 和网络开销。

  • SHARD_ROW_ID_BITS = 4 表示 16 个分片
  • SHARD_ROW_ID_BITS = 6 表示 64 个分片
  • SHARD_ROW_ID_BITS = 0 表示默认值 1 个分片

语句示例:

  • CREATE TABLECREATE TABLE t (c int) SHARD_ROW_ID_BITS = 4;
  • ALTER TABLEALTER TABLE t SHARD_ROW_ID_BITS = 4;

tidb_slow_log_threshold

作用域:SESSION

默认值:300

输出慢日志的耗时阈值。当查询大于这个值,就会当做是一个慢查询,输出到慢查询日志。默认为 300ms。

示例:

set tidb_slow_log_threshold = 200

tidb_query_log_max_len

作用域:SESSION

默认值:2048 (bytes)

最长的 SQL 输出长度。当语句的长度大于 query-log-max-len,将会被截断输出。

示例:

set tidb_query_log_max_len = 20