系统变量

TiDB 系统变量的行为与 MySQL 相似,变量的作用范围可以是会话级别有效 (Session Scope) 或全局范围有效 (Global Scope)。其中:

  • 对 SESSION 作用域变量的更改,设置后只影响当前会话。
  • 对 GLOBAL 作用域变量的更改,设置后立即生效。如果该变量也有 SESSION 作用域,已经连接的所有会话 (包括当前会话) 将继续使用会话当前的 SESSION 变量值。
  • 要设置变量值,可使用 SET 语句。
1. # 以下两个语句等价地改变一个 Session 变量
2. SET tidb_distsql_scan_concurrency = 10;
3. SET SESSION tidb_distsql_scan_concurrency = 10;

5. # 以下两个语句等价地改变一个 Global 变量
6. SET @@global.tidb_distsql_scan_concurrency = 10;
7. SET GLOBAL tidb_distsql_scan_concurrency = 10;

系统变量 - 图1

注意

部分 GLOBAL 作用域的变量会持久化到 TiDB 集群中。文档中的变量有一个“是否持久化到集群”的说明,可以为“是”或者“否”。

  • 对于持久化到集群的变量,当该全局变量被修改后,会通知所有 TiDB 服务器刷新其系统变量缓存。在集群中增加一个新的 TiDB 服务器时,或者重启现存的 TiDB 服务器时,都将自动使用该持久化变量。
  • 对于不持久化到集群的变量,对变量的修改只对当前连接的 TiDB 实例生效。如果需要保留设置过的值,需要在 tidb.toml 配置文件中声明。

此外,由于应用和连接器通常需要读取 MySQL 变量,为了兼容这一需求,在 TiDB 中,部分 MySQL 的变量既可读取也可设置。例如,尽管 JDBC 连接器不依赖于查询缓存 (query cache) 的行为,但仍然可以读取和设置查询缓存。

系统变量 - 图2

注意

变量取较大值并不总会带来更好的性能。由于大部分变量对单个连接生效,设置变量时,还应考虑正在执行语句的并发连接数量。

确定安全值时,应考虑变量的单位:

  • 如果单位为线程,安全值通常取决于 CPU 核的数量。
  • 如果单位为字节,安全值通常小于系统内存的总量。
  • 如果单位为时间,单位可能为秒或毫秒。

单位相同的多个变量可能会争夺同一组资源。

从 v7.4.0 开始,部分 SESSION 作用域的变量可以通过 SET_VAR Hint 在语句执行期间临时修改变量的值。当语句执行完成后,系统变量将在当前会话中自动恢复为原始值。通过这个 Hint 可以修改一部分与优化器、执行器相关的系统变量行为。文档中的变量有一个“是否受 Hint SET_VAR 控制”的说明,可以为“是”或者“否”。

  • 对于受 Hint SET_VAR 控制的变量,你可以在语句中使用 /*+ SET_VAR(...) */ 修改语句执行期间变量的值。
  • 对于不受 Hint SET_VAR 控制的变量,你不能在语句中使用 /*+ SET_VAR(...) */ 修改语句执行期间变量的值。

关于 SET_VAR Hint 的更多说明,参考 SET_VAR。

变量参考

allow_auto_random_explicit_insert 从 v4.0.3 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 是否允许在 INSERT 语句中显式指定含有 AUTO_RANDOM 属性的列的值。

authentication_ldap_sasl_auth_method_name 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:枚举型
  • 默认值:SCRAM-SHA-1
  • 可选值:SCRAM-SHA-1、SCRAM-SHA-256、GSSAPI
  • LDAP SASL 身份验证中,验证方法的名称。

authentication_ldap_sasl_bind_base_dn 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:””
  • LDAP SASL 身份验证中,搜索用户的范围。如果创建用户时没有通过 AS ... 指定 dn,TiDB 会自动在 LDAP Server 的该范围中根据用户名搜索用户 dn。例如 dc=example,dc=org。

authentication_ldap_sasl_bind_root_dn 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:””
  • LDAP SASL 身份验证中,TiDB 登录 LDAP Server 搜索用户时使用的 dn。

authentication_ldap_sasl_bind_root_pwd 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:””
  • LDAP SASL 身份验证中,TiDB 登录 LDAP Server 搜索用户时使用的密码。

authentication_ldap_sasl_ca_path 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:””
  • LDAP SASL 身份验证中,TiDB 对 StartTLS 连接使用的 CA 证书的路径。

authentication_ldap_sasl_init_pool_size 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:10
  • 范围:[1, 32767]
  • LDAP SASL 身份验证中,TiDB 与 LDAP Server 间连接池的初始连接数。

authentication_ldap_sasl_max_pool_size 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:1000
  • 范围:[1, 32767]
  • LDAP SASL 身份验证中,TiDB 与 LDAP Server 间连接池的最大连接数。

authentication_ldap_sasl_server_host 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:””
  • LDAP SASL 身份验证中,LDAP Server 的主机名或地址。

authentication_ldap_sasl_server_port 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:389
  • 范围:[1, 65535]
  • LDAP SASL 身份验证中,LDAP Server 的 TCP/IP 端口号。

authentication_ldap_sasl_tls 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • LDAP SASL 身份验证中,是否使用 StartTLS 对连接加密。

authentication_ldap_simple_auth_method_name 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:枚举型
  • 默认值:SIMPLE
  • 可选值:SIMPLE
  • LDAP simple 身份验证中,验证方法的名称。现在仅支持 SIMPLE。

authentication_ldap_simple_bind_base_dn 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:””
  • LDAP simple 身份验证中,搜索用户的范围。如果创建用户时没有通过 AS ... 指定 dn,TiDB 会自动在 LDAP Server 的该范围中根据用户名搜索用户 dn。例如 dc=example,dc=org。

authentication_ldap_simple_bind_root_dn 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:””
  • LDAP simple 身份验证中,TiDB 登录 LDAP Server 搜索用户时使用的 dn。

authentication_ldap_simple_bind_root_pwd 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:””
  • LDAP simple 身份验证中,TiDB 登录 LDAP Server 搜索用户时使用的密码。

authentication_ldap_simple_ca_path 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:””
  • LDAP simple 身份验证中,TiDB 对 StartTLS 连接使用的 CA 证书的路径。

authentication_ldap_simple_init_pool_size 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:10
  • 范围:[1, 32767]
  • LDAP simple 身份验证中,TiDB 与 LDAP Server 间连接池的初始连接数。

authentication_ldap_simple_max_pool_size 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:1000
  • 范围:[1, 32767]
  • LDAP simple 身份验证中,TiDB 与 LDAP Server 间连接池的最大连接数。

authentication_ldap_simple_server_host 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:””
  • LDAP simple 身份验证中,LDAP Server 的主机名或地址。

authentication_ldap_simple_server_port 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:389
  • 范围:[1, 65535]
  • LDAP simple 身份验证中,LDAP Server 的 TCP/IP 端口号。

authentication_ldap_simple_tls 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • LDAP simple 身份验证中,是否使用 StartTLS 对连接加密。

auto_increment_increment

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:1
  • 范围:[1, 65535]
  • 控制 AUTO_INCREMENT 自增值字段的自增步长和 AUTO_RANDOM ID 的分配规则。该变量常与 auto_increment_offset 一起使用。

auto_increment_offset

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:1
  • 范围:[1, 65535]
  • 控制 AUTO_INCREMENT 自增值字段的初始值和 AUTO_RANDOM ID 的分配规则。该变量常与 auto_increment_increment 一起使用。示例如下:
1. mysql> CREATE TABLE t1 (a int not null primary key auto_increment);
2. Query OK, 0 rows affected (0.10 sec)

4. mysql> set auto_increment_offset=1;
5. Query OK, 0 rows affected (0.00 sec)

7. mysql> set auto_increment_increment=3;
8. Query OK, 0 rows affected (0.00 sec)

10. mysql> INSERT INTO t1 VALUES (),(),(),();
11. Query OK, 4 rows affected (0.04 sec)
12. Records: 4  Duplicates: 0  Warnings: 0

14. mysql> SELECT * FROM t1;
15. +----+
16. | a  |
17. +----+
18. |  1 |
19. |  4 |
20. |  7 |
21. | 10 |
22. +----+
23. 4 rows in set (0.00 sec)

autocommit

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:ON
  • 用于设置在非显式事务时是否自动提交事务。更多信息,请参见事务概述。

block_encryption_mode

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:枚举型
  • 默认值:aes-128-ecb
  • 可选值:aes-128-ecb、aes-192-ecb、aes-256-ecb、aes-128-cbc、aes-192-cbc、aes-256-cbc、aes-128-ofb、aes-192-ofb、aes-256-ofb、aes-128-cfb、aes-192-cfb、aes-256-cfb
  • 该变量用于设置 AES_ENCRYPT() 和 AES_DECRYPT() 函数的加密模式。

character_set_client

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:utf8mb4
  • 这个变量表示从客户端发出的数据所用的字符集。有关更多 TiDB 支持的字符集和排序规则,参阅字符集和排序规则文档。如果需要更改字符集,建议使用 SET NAMES 语句。

character_set_connection

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:utf8mb4
  • 若没有为字符串常量指定字符集,该变量表示这些字符串常量所使用的字符集。

character_set_database

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:utf8mb4
  • 该变量表示当前默认在用数据库的字符集,不建议设置该变量。选择新的默认数据库后,服务器会更改该变量的值。

character_set_results

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:utf8mb4
  • 该变量表示数据发送至客户端时所使用的字符集。

character_set_server

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:utf8mb4
  • 当 CREATE SCHEMA 中没有指定字符集时,该变量表示这些新建的表结构所使用的字符集。

collation_connection

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:utf8mb4_bin
  • 该变量表示连接中所使用的排序规则。与 MySQL 中的 collation_connection 一致。

collation_database

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:utf8mb4_bin
  • 该变量表示当前数据库默认所使用的排序规则。与 MySQL 中的 collation_database 一致。不建议设置此变量,当前使用的数据库变动时,此变量会被 TiDB 修改。

collation_server

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:utf8mb4_bin
  • 该变量表示创建数据库时默认的排序规则。

cte_max_recursion_depth

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 类型:整数型
  • 默认值:1000
  • 范围:[0, 4294967295]
  • 这个变量用于控制公共表表达式的最大递归深度。

datadir

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:使用的组件和部署方式不同,默认值也不同。
  • /tmp/tidb:如果你将 --store 设置为 "unistore" 或没有设置 --store,则默认值为 /tmp/tidb。
  • ${pd-ip}:${pd-port}:如果你设置的存储引擎是 TiKV(如果使用 TiUP 和 TiDB Operator 部署,则默认的存储引擎为 TiKV),则默认值为 ${pd-ip}:${pd-port}。
  • 这个变量表示数据存储的位置,位置可以是本地路径 /tmp/tidb。如果数据存储在 TiKV 上,则可以是指向 PD 服务器的路径。变量值的格式为 ${pd-ip}:${pd-port},表示 TiDB 在启动时连接到的 PD 服务器。

ddl_slow_threshold

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:300
  • 取值范围:[0, 2147483647]
  • 单位:毫秒
  • 耗时超过该阈值的 DDL 操作会被输出到日志。

default_authentication_plugin

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:枚举型
  • 默认值:mysql_native_password
  • 可选值:mysql_native_password,caching_sha2_password,tidb_sm3_password,tidb_auth_token,authentication_ldap_sasl 或 authentication_ldap_simple。
  • 服务器和客户端建立连接时,这个变量用于设置服务器对外通告的默认身份验证方式。如要了解该变量的其他可选值,参见可用的身份验证插件。
  • 若要在用户登录时使用 tidb_sm3_password 插件,需要使用 TiDB-JDBC 进行连接。

default_collation_for_utf8mb4 从 v7.4.0 版本开始引入

  • 作用域:GLOBAL | SESSION
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:utf8mb4_bin
  • 可选值:utf8mb4_bin、utf8mb4_general_ci、utf8mb4_0900_ai_ci
  • 该变量用于设置 utf8mb4 字符集的默认排序规则。它会影响以下语句的行为:
  • SHOW COLLATION 和 SHOW CHARACTER SET 语句显示的默认排序规则。
  • CREATE TABLE 和 ALTER TABLE 语句中对表或列使用 CHARACTER SET 语法明确指定 utf8mb4 字符集而未指定排序规则时,将使用该变量指定的排序规则。不影响未使用 CHARACTER SET 语法时的行为。
  • CREATE DATABASE 和 ALTER DATABASE 语句中使用 CHARACTER SET 语法明确指定 utf8mb4 字符集而未指定排序规则时,将使用该变量指定的排序规则。不影响未使用 CHARACTER SET 语法时的行为。
  • 任何使用 _utf8mb4'string' 形式的字面量在未使用 COLLATE 语法指定排序规则时,将使用该变量指定的排序规则。

default_password_lifetime 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:0
  • 取值范围:[0, 65535]
  • 该变量用于设置全局自动密码过期策略,默认值为 0,即禁用全局自动密码过期。如果设置该变量的值为正整数 N,则表示允许的密码生存期为 N,即必须在 N 天之内更改密码。

default_week_format

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:0
  • 取值范围:[0, 7]
  • 设置 WEEK() 函数使用的周格式。

disconnect_on_expired_password 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:ON
  • 该变量是一个只读变量,用来显示 TiDB 是否会直接断开密码已过期用户的连接。当其值为 ON,表示 TiDB 会断开密码已过期用户的连接。当其值为 OFF,表示 TiDB 会将密码已过期用户的连接置于“沙盒模式”,允许该用户建立连接并执行密码重置操作。
  • 如果需要改变 TiDB 对密码已过期用户连接的处理方式,请在 TiDB 配置文件中的 [security] 部分修改 disconnect-on-expired-password 选项。

div_precision_increment 从 v8.0.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 类型:整数型
  • 默认值:4
  • 范围:[0, 30]
  • 这个变量用于控制使用运算符 / 执行除法操作时,结果增加的小数位数。该功能与 MySQL 保持一致。

error_count

  • 作用域:SESSION
  • 默认值:0
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 表示上一条生成消息的 SQL 语句中的错误数。该变量为只读变量。

foreign_key_checks

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:在 v6.6.0 之前版本中为 OFF,在 v6.6.0 及之后的版本中为 ON。
  • 表示是否开启外键约束检查。

group_concat_max_len

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:1024
  • 取值范围:[4, 18446744073709551615]
  • 表示 GROUP_CONCAT() 函数缓冲区的最大长度。

have_openssl

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:DISABLED
  • 用于 MySQL 兼容性的只读变量。当服务器启用 TLS 时,服务器将其设置为 YES。

have_ssl

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:DISABLED
  • 用于 MySQL 兼容性的只读变量。当服务器启用 TLS 时,服务器将其设置为 YES。

hostname

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:(系统主机名)
  • 这个变量为只读变量,表示 TiDB server 的主机名。

identity 从 v5.3.0 版本开始引入

init_connect

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:””
  • 用户首次连接到 TiDB 服务器时,init_connect 特性允许 TiDB 自动执行一条或多条 SQL 语句。如果你有 CONNECTION_ADMIN 或者 SUPER 权限,这些 SQL 语句将不会被自动执行。如果这些语句执行报错,你的用户连接将被终止。

innodb_lock_wait_timeout

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:50
  • 范围:[1, 3600]
  • 单位:秒
  • 悲观事务语句等锁时间。

interactive_timeout

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:28800
  • 范围:[1, 31536000]
  • 单位:秒
  • 该变量表示交互式用户会话的空闲超时。交互式用户会话是指使用 CLIENT_INTERACTIVE 选项调用 mysql_real_connect() API 建立的会话(例如:MySQL shell 和 MySQL client)。该变量与 MySQL 完全兼容。

last_insert_id 从 v5.3.0 版本开始引入

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:0
  • 取值范围:[0, 18446744073709551615]
  • 返回由 INSERT 语句产生的最新 AUTO_INSCRENT 或者 AUTO_RANDOM 值,与 LAST_INSERT_ID() 的返回的结果相同。与 MySQL 中的 last_insert_id 一致。

last_plan_from_binding 从 v4.0 版本开始引入

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 该变量用来显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。

last_plan_from_cache 从 v4.0 版本开始引入

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用来显示上一个 execute 语句所使用的执行计划是不是直接从 plan cache 中取出来的。

last_sql_use_alloc 从 v6.4.0 版本开始引入

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:OFF
  • 这个变量是一个只读变量,用来显示上一个语句是否使用了缓存的 Chunk 对象 (Chunk allocation)。

license

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:Apache License 2.0
  • 这个变量表示 TiDB 服务器的安装许可证。

log_bin

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 该变量表示是否使用 TiDB Binlog。

max_connections

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:0
  • 取值范围:[0, 100000]
  • 该变量表示 TiDB 中同时允许的最大客户端连接数,用于资源控制。
  • 默认情况下,该变量值为 0 表示不限制客户端连接数。当本变量的值大于 0 且客户端连接数到达此值时,TiDB 服务端将会拒绝新的客户端连接。

max_execution_time

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 类型:整数型
  • 默认值:0
  • 范围:[0, 2147483647]
  • 单位:毫秒
  • 语句最长执行时间。默认值 (0) 表示无限制。

系统变量 - 图3

注意

  • max_execution_time 目前只用于控制只读语句的最大执行时长,实际精度在 100ms 级别,而非更准确的毫秒级别。
  • 对于使用了 MAX_EXECUTION_TIME Hint 的 SQL 语句,这些语句的最长执行时间将不受该变量限制,而是由该 Hint 进行限制。你也可以使用该 Hint 来创建 SQL 绑定,详情请参考 SQL 操作常见问题。

max_prepared_stmt_count

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:-1
  • 范围:[-1, 1048576]
  • 指定当前实例中 PREPARE 语句的最大数量。
  • 值为 -1 时表示不对实例中的 PREPARE 语句数量进行限制。
  • 如果将变量值设为超过上限 1048576,则使用上限值 1048576:
1. mysql> SET GLOBAL max_prepared_stmt_count = 1048577;
2. Query OK, 0 rows affected, 1 warning (0.01 sec)

4. mysql> SHOW WARNINGS;
5. +---------+------+--------------------------------------------------------------+
6. | Level   | Code | Message                                                      |
7. +---------+------+--------------------------------------------------------------+
8. | Warning | 1292 | Truncated incorrect max_prepared_stmt_count value: '1048577' |
9. +---------+------+--------------------------------------------------------------+
10. 1 row in set (0.00 sec)

12. mysql> SHOW GLOBAL VARIABLES LIKE 'max_prepared_stmt_count';
13. +-------------------------+---------+
14. | Variable_name           | Value   |
15. +-------------------------+---------+
16. | max_prepared_stmt_count | 1048576 |
17. +-------------------------+---------+
18. 1 row in set (0.00 sec)

max_allowed_packet 从 v6.1.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:67108864
  • 取值范围:[1024, 1073741824]
  • 该变量取值应为 1024 的整数倍。若取值无法被 1024 整除,则会提示 warning 并向下取整。例如设置为 1025 时,则 TiDB 中的实际取值为 1024。
  • 服务器端和客户端在一次传送数据包的过程中所允许最大的数据包大小,单位为字节。
  • 在 SESSION 作用域下,该变量为只读变量。
  • 该变量的行为与 MySQL 兼容。

mpp_exchange_compression_mode 从 v6.6.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 默认值:UNSPECIFIED
  • 可选值:NONE,FAST,HIGH_COMPRESSION,UNSPECIFIED
  • 该变量用于选择 MPP Exchange 算子的数据压缩模式,当 TiDB 选择版本号为 1 的 MPP 执行计划时生效。该变量值的含义如下:
  • UNSPECIFIED:表示未指定,TiDB 将自动选择压缩模式,当前 TiDB 自动选择 FAST 模式
  • NONE:不使用数据压缩
  • FAST:快速模式,整体性能较好,压缩比小于 HIGH_COMPRESSION
  • HIGH_COMPRESSION:高压缩比模式

mpp_version 从 v6.6.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 默认值:UNSPECIFIED
  • 可选值:UNSPECIFIED,0,1
  • 该变量用于指定不同版本的 MPP 执行计划。指定后,TiDB 会选择指定版本的 MPP 执行计划。该变量值含义如下:
  • UNSPECIFIED:表示未指定,此时 TiDB 自动选择最新版本 1。
  • 0:兼容所有 TiDB 集群版本,MPP 版本大于 0 的新特性均不会生效。
  • 1:从 v6.6.0 版本开始引入,用于开启 TiFlash 带压缩的数据交换,详情参见 MPP Version 和 Exchange 数据压缩。

password_history 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:0
  • 范围:[0, 4294967295]
  • 该变量用于建立密码重用策略,使 TiDB 基于密码更改次数限制密码的重复使用。该变量默认值为 0,表示禁用基于密码更改次数的密码重用策略。当设置该变量为一个正整数 N 时,表示不允许重复使用最近 N 次使用过的密码。

password_reuse_interval 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:0
  • 范围:[0, 4294967295]
  • 该变量用于建立密码重用策略,使 TiDB 基于经过时间限制密码重复使用。该变量默认值为 0,表示禁用基于密码经过时间的密码重用策略。当设置该变量为一个正整数 N 时,表示不允许重复使用最近 N 天内使用过的密码。

pd_enable_follower_handle_region 从 v7.6.0 版本开始引入

系统变量 - 图4

警告

Active PD Follower 目前为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。如果发现 bug,请在 GitHub 上提 issue 反馈。

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用于控制是否开启 Active PD Follower 特性(目前该特性只适用于处理获取 Region 信息的相关请求)。当该值为 OFF 时,TiDB 仅从 PD leader 获取 Region 信息。当该值为 ON 时,TiDB 在获取 Region 信息时会将请求均匀地发送到所有 PD 节点上,因此 PD follower 也可以处理 Region 信息请求,从而减轻 PD leader 的 CPU 压力。
  • 适合开启 Active PD Follower 的场景:
  • 集群 Region 数量较多,PD leader 由于处理心跳和调度任务的开销大,导致 CPU 资源紧张。
  • 集群中 TiDB 实例数量较多,Region 信息请求并发量较大,PD leader CPU 压力大。

plugin_dir

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:””
  • 指定加载插件的目录。

plugin_load

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:””
  • 指定 TiDB 启动时加载的插件,多个插件之间用逗号(,)分隔。

port

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:4000
  • 范围:[0, 65535]
  • 使用 MySQL 协议时 tidb-server 监听的端口。

rand_seed1

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:0
  • 范围:[0, 2147483647]
  • 该变量用于为 SQL 函数 RAND() 中使用的随机值生成器添加种子。
  • 该变量的行为与 MySQL 兼容。

rand_seed2

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:0
  • 范围:[0, 2147483647]
  • 该变量用于为 SQL 函数 RAND() 中使用的随机值生成器添加种子。
  • 该变量的行为与 MySQL 兼容。

require_secure_transport 从 v6.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 该变量控制是否所有 TiDB 的连接都在本地 socket 上进行通信,或使用 TLS。详情见为 TiDB 客户端服务端间通信开启加密传输。
  • 该变量设置为 ON 时,必须使用开启 TLS 的会话连接到 TiDB,防止在 TLS 配置不正确时出现锁定的情况。
  • 在 v6.1.0 之前这个开关通过 TiDB 配置文件 (security.require-secure-transport) 进行配置,升级到 v6.1.0 时会自动继承原有设置。
  • 从 v6.5.6、v7.1.2、v7.5.1 和 v8.0.0 起,当启用了安全增强模式 (SEM) 时,禁止将 security.require-secure-transport 设置为 ON。

skip_name_resolve 从 v5.2.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 该变量控制 tidb-server 实例是否将主机名作为连接握手的一部分来解析。
  • 当 DNS 不可靠时,可以启用该变量来提高网络性能。

系统变量 - 图5

注意

当 skip_name_resolve 设置为 ON 时,身份信息中包含主机名的用户将无法登录服务器。例如:

1. CREATE USER 'appuser'@'apphost' IDENTIFIED BY 'app-password';

该示例中,建议将 apphost 替换为 IP 地址或通配符(%)。

socket

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:””
  • 使用 MySQL 协议时,tidb-server 所监听的本地 unix 套接字文件。

sql_log_bin

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:ON
  • 表示是否将更改写入 TiDB Binlog。

系统变量 - 图6

注意

不建议将 sql_log_bin 设置为全局变量,因为 TiDB 的未来版本可能只允许将其设置为会话变量。

sql_mode

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 默认值:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  • 这个变量控制许多 MySQL 兼容行为。详情见 SQL 模式。

sql_require_primary_key 从 v6.3.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用于控制表是否必须有主键。启用该变量后,如果在没有主键的情况下创建或修改表,将返回错误。
  • 该功能基于 MySQL 8.0 的特性 sql_require_primary_key。
  • 强烈推荐在使用 TiCDC 时启用该变量,因为同步数据变更至 MySQL sink 时要求表必须有主键。
  • 如果启用了该变量,且使用了 TiDB Data Migration (DM) 来迁移数据,建议在 DM 任务配置文件里的 session 中添加该系统变量 sql_require_primary_key 并设置为 OFF,否则会导致 DM 任务创建失败。

sql_select_limit 从 v4.0.2 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:18446744073709551615
  • 范围:[0, 18446744073709551615]
  • 单位:行
  • SELECT 语句返回的最大行数。

ssl_ca

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:””
  • 证书颁发机构 (CA) 文件的位置。若文件不存在,则变量值为空。该变量的值由 TiDB 配置项 ssl-ca 定义。

ssl_cert

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:””
  • 用于 SSL/TLS 连接的证书文件的位置。若文件不存在,则变量值为空。该变量的值由 TiDB 配置项 ssl-cert 定义。

ssl_key

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:””
  • 用于 SSL/TLS 连接的私钥文件的位置。若文件不存在,则变量值为空。该变量的值由 TiDB 配置项 ssl-key 定义。

system_time_zone

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:(随系统)
  • 该变量显示首次引导启动 TiDB 时的系统时区。另请参阅 time_zone。

tidb_adaptive_closest_read_threshold 从 v6.3.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:4096
  • 取值范围:[0, 9223372036854775807]
  • 单位:字节
  • 这个变量用于控制当 replica-read 设置为 closest-adaptive 时,优先将读请求发送至 TiDB server 所在区域副本的阈值。当读请求预估的返回结果的大小超过此阈值时,TiDB 会将读请求优先发送至同一可用区的副本,否则会发送至 leader 副本。

tidb_allow_tiflash_cop 从 v7.3.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 当 TiDB 给 TiFlash 下推计算任务时,有三种方法(或协议)可供选择:Cop、BatchCop 和 MPP。相比于 Cop 和 BatchCop,MPP 协议更加成熟,提供更好的任务和资源管理。因此,更推荐使用 MPP 协议。

  • 0 或 OFF:优化器仅生成使用 TiFlash MPP 协议的计划。

  • 1 或 ON:优化器根据成本估算从 Cop、BatchCop 和 MPP 协议中选择一个用于生成执行计划。

tidb_allow_batch_cop 从 v4.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 类型:整数型
  • 默认值:1
  • 范围:[0, 2]
  • 这个变量用于控制 TiDB 向 TiFlash 发送 coprocessor 请求的方式,有以下几种取值:

  • 0:从不批量发送请求

  • 1:aggregation 和 join 的请求会进行批量发送
  • 2:所有的 cop 请求都会批量发送

tidb_allow_fallback_to_tikv 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 默认值:””
  • 这个变量表示将 TiKV 作为备用存储引擎的存储引擎列表。当该列表中的存储引擎发生故障导致 SQL 语句执行失败时,TiDB 会使用 TiKV 作为存储引擎再次执行该 SQL 语句。目前支持设置该变量为 “” 或者 “tiflash”。如果设置该变量为 “tiflash”,当 TiFlash 返回超时错误(对应的错误码为 ErrTiFlashServerTimeout)时,TiDB 会使用 TiKV 作为存储引擎再次执行该 SQL 语句。

tidb_allow_function_for_expression_index 从 v5.2.0 版本开始引入

  • 作用域:NONE
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:json_array、json_array_append、json_array_insert、json_contains、json_contains_path、json_depth、json_extract、json_insert、json_keys、json_length、json_merge_patch、json_merge_preserve、json_object、json_pretty、json_quote、json_remove、json_replace、json_search、json_set、json_storage_size、json_type、json_unquote、json_valid、lower、md5、reverse、tidb_shard、upper、vitess_hash
  • 这个变量用于显示创建表达式索引所允许使用的函数。

tidb_allow_mpp 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 类型:布尔型
  • 默认值:ON
  • 这个变量用于控制是否使用 TiFlash 的 MPP 模式执行查询,可以设置的值包括:
  • 0 或 OFF,代表从不使用 MPP 模式。如果在 v7.3.0 及之后的版本将该变量值设置为 0 或 OFF,你需要同时开启 tidb_allow_tiflash_cop 变量,否则可能遇到查询报错。
  • 1 或 ON,代表由优化器根据代价估算选择是否使用 MPP 模式(默认)。

MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数据交换并提供高性能、高吞吐的 SQL 算法。MPP 模式选择的详细说明参见控制是否选择 MPP 模式。

tidb_allow_remove_auto_inc 从 v2.1.18 和 v3.0.4 版本开始引入

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用来控制是否允许通过 ALTER TABLE MODIFY 或 ALTER TABLE CHANGE 来移除某个列的 AUTO_INCREMENT 属性。默认 (OFF) 为不允许。

tidb_analyze_distsql_scan_concurrency 从 v7.6.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:4
  • 范围:[1, 4294967295]
  • 这个变量用来设置执行 ANALYZE 时 scan 操作的并发度。

tidb_analyze_partition_concurrency

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:2。TiDB v7.4.0 及其之前版本默认值为 1。
  • 这个变量用于 TiDB analyze 分区表时,对分区表统计信息进行读写的并发度。

tidb_analyze_version 从 v5.1.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:2
  • 范围:[1, 2]
  • 这个变量用于控制 TiDB 收集统计信息的行为。
  • 在 v5.3.0 及之后的版本中,该变量的默认值为 2,具体可参照常规统计信息文档。如果从 v5.3.0 之前版本的集群升级至 v5.3.0 及之后的版本,tidb_analyze_version 的默认值不发生变化。

tidb_analyze_skip_column_types 从 v7.2.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:”json,blob,mediumblob,longblob”
  • 可选值:”json,blob,mediumblob,longblob,text,mediumtext,longtext”
  • 这个变量表示在执行 ANALYZE 命令收集统计信息时,跳过哪些类型的列的统计信息收集。该变量仅适用于 tidb_analyze_version = 2 的情况。即使使用 ANALYZE TABLE t COLUMNS c1, ..., cn 语法指定列,如果指定的列的类型在 tidb_analyze_skip_column_types 中,也不会收集该列的统计信息。
1. mysql> SHOW CREATE TABLE t;
2. +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3. | Table | Create Table                                                                                                                                                                                                             |
4. +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
5. | t     | CREATE TABLE `t` (
6. `a` int(11) DEFAULT NULL,
7. `b` varchar(10) DEFAULT NULL,
8. `c` json DEFAULT NULL,
9. `d` blob DEFAULT NULL,
10. `e` longblob DEFAULT NULL
11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
12. +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
13. 1 row in set (0.00 sec)

15. mysql> SELECT @@tidb_analyze_skip_column_types;
16. +----------------------------------+
17. | @@tidb_analyze_skip_column_types |
18. +----------------------------------+
19. | json,blob,mediumblob,longblob    |
20. +----------------------------------+
21. 1 row in set (0.00 sec)

23. mysql> ANALYZE TABLE t;
24. Query OK, 0 rows affected, 1 warning (0.05 sec)

26. mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1;
27. +---------------------------------------------------------------------+
28. | job_info                                                            |
29. +---------------------------------------------------------------------+
30. | analyze table columns a, b with 256 buckets, 500 topn, 1 samplerate |
31. +---------------------------------------------------------------------+
32. 1 row in set (0.00 sec)

34. mysql> ANALYZE TABLE t COLUMNS a, c;
35. Query OK, 0 rows affected, 1 warning (0.04 sec)

37. mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1;
38. +------------------------------------------------------------------+
39. | job_info                                                         |
40. +------------------------------------------------------------------+
41. | analyze table columns a with 256 buckets, 500 topn, 1 samplerate |
42. +------------------------------------------------------------------+
43. 1 row in set (0.00 sec)

tidb_auto_analyze_end_time

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:时间
  • 默认值:23:59 +0000
  • 这个变量用来设置一天中允许自动 ANALYZE 更新统计信息的结束时间。例如,只允许在 UTC 时间的凌晨 1:00 至 3:00 之间自动更新统计信息,可以设置如下:

  • tidb_auto_analyze_start_time='01:00 +0000'

  • tidb_auto_analyze_end_time='03:00 +0000'

tidb_auto_analyze_partition_batch_size 从 v6.4.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:128。对于 TiDB v7.6.0 之前的版本,默认值为 1。
  • 范围:[1, 1024]
  • 用于设置 TiDB 自动 analyze 分区表(即自动收集分区表上的统计信息)时,每次同时 analyze 分区的个数。
  • 若该变量值小于分区表的分区数,则 TiDB 会分多批自动 analyze 该分区表的所有分区。若该变量值大于等于分区表的分区数,则 TiDB 会同时 analyze 该分区表的所有分区。
  • 若分区表个数远大于该变量值,且自动 analyze 花费时间较长,可调大该参数的值以减少耗时。

tidb_auto_analyze_ratio

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:浮点数
  • 默认值:0.5
  • 范围:(0, 1],v8.0.0 及之前版本范围为 [0, 18446744073709551615]。
  • 这个变量用来设置 TiDB 在后台自动执行 ANALYZE TABLE 更新统计信息的阈值。0.5 指的是当表中超过 50% 的行被修改时,触发自动 ANALYZE 更新。可以指定 tidb_auto_analyze_start_time 和 tidb_auto_analyze_end_time 来限制自动 ANALYZE 的时间。

系统变量 - 图7

注意

当系统变量 tidb_enable_auto_analyze 设置为 ON 时,TiDB 才会触发 auto_analyze。

tidb_auto_analyze_start_time

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:时间
  • 默认值:00:00 +0000
  • 这个变量用来设置一天中允许自动 ANALYZE 更新统计信息的开始时间。例如,只允许在 UTC 时间的凌晨 1:00 至 3:00 之间自动更新统计信息,可以设置如下:

  • tidb_auto_analyze_start_time='01:00 +0000'

  • tidb_auto_analyze_end_time='03:00 +0000'

tidb_auto_build_stats_concurrency 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:1
  • 范围:[1, 256]
  • 这个变量用来设置执行统计信息自动更新的并发度。

tidb_backoff_lock_fast

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:10
  • 范围:[1, 2147483647]
  • 这个变量用来设置读请求遇到锁的 backoff 时间。

tidb_backoff_weight

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:2
  • 范围:[0, 2147483647]
  • 这个变量用来给 TiDB 的 backoff 最大时间增加权重,即内部遇到网络或其他组件 (TiKV, PD) 故障时,发送重试请求的最大重试时间。可以通过这个变量来调整最大重试时间,最小值为 1。

例如,TiDB 向 PD 取 TSO 的基础超时时间是 15 秒,当 tidb_backoff_weight = 2 时,取 TSO 的最大超时时间为:基础时间 * 2 等于 30 秒。

在网络环境较差的情况下,适当增大该变量值可以有效缓解因为超时而向应用端报错的情况;而如果应用端希望更快地接到报错信息,则应该尽量减小该变量的值。

tidb_batch_commit

系统变量 - 图8

警告

不建议开启此变量。

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 该变量控制是否启用已废弃的 batch-commit 特性。当该变量开启时,事务可能会通过分组一些语句被拆分为多个事务,并被非原子地提交。不推荐使用这种方式。

tidb_batch_delete

系统变量 - 图9

警告

该变量与废弃的 batch-dml 特性相关,可能会导致数据损坏。因此,不建议开启该变量来使用 batch-dml。作为替代,请使用非事务 DML 语句。

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 该变量控制是否启用已废弃的 batch-dml 特性中的 batch-delete 特性。当该变量开启时,DELETE 语句可能会被拆分为多个事务,并被非原子地提交。要使该特性生效,还需要开启 tidb_enable_batch_dml 并将 tidb_dml_batch_size 的值设置为正数。不推荐使用这种方式。

tidb_batch_insert

系统变量 - 图10

警告

该变量与废弃的 batch-dml 特性相关,可能会导致数据损坏。因此,不建议开启该变量来使用 batch-dml。作为替代,请使用非事务 DML 语句。

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 该变量控制是否启用已废弃的 batch-dml 特性中的 batch-insert 特性。当该变量开启时,INSERT 语句可能会被拆分为多个事务,并被非原子地提交。要使该特性生效,还需要开启 tidb_enable_batch_dml 并将 tidb_dml_batch_size 的值设置为正数。不推荐使用这种方式。

tidb_batch_pending_tiflash_count 从 v6.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:4000
  • 范围:[0, 4294967295]
  • 使用 ALTER DATABASE SET TIFLASH REPLICA 语句为 TiFlash 添加副本时,能容许的不可用表的个数上限。如果超过该上限,则会停止或者以非常慢的速度为库中的剩余表设置 TiFlash 副本。

tidb_broadcast_join_threshold_count 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 类型:整数型
  • 默认值:10240
  • 范围:[0, 9223372036854775807]
  • 单位:行
  • 如果 join 的对象为子查询,优化器无法估计子查询结果集大小,在这种情况下通过结果集行数判断。如果子查询的行数估计值小于该变量,则选择 Broadcast Hash Join 算法。否则选择 Shuffled Hash Join 算法。
  • 开启 tidb_prefer_broadcast_join_by_exchange_data_size 功能后,该变量将不再生效。

tidb_broadcast_join_threshold_size 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 类型:整数型
  • 默认值:104857600 (100 MiB)
  • 范围:[0, 9223372036854775807]
  • 单位:字节
  • 如果表大小(字节数)小于该值,则选择 Broadcast Hash Join 算法。否则选择 Shuffled Hash Join 算法。
  • 开启 tidb_prefer_broadcast_join_by_exchange_data_size 功能后,该变量将不再生效。

tidb_build_stats_concurrency

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 单位:线程
  • 默认值:2。TiDB v7.4.0 及其之前版本默认值为 4。
  • 取值范围:[1, 256]
  • 这个变量用来设置 ANALYZE 语句执行时并发度。
  • 当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。

tidb_build_sampling_stats_concurrency 从 v7.5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 单位:线程
  • 默认值:2
  • 取值范围:[1, 256]
  • 这个变量用来设置 ANALYZE 过程中的采样并发度。
  • 当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。

tidb_capture_plan_baselines 从 v4.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用于控制是否开启自动捕获绑定功能。该功能依赖 Statement Summary,因此在使用自动绑定之前需打开 Statement Summary 开关。
  • 开启该功能后会定期遍历一次 Statement Summary 中的历史 SQL 语句,并为至少出现两次的 SQL 语句自动创建绑定。

tidb_cdc_write_source 从 v6.5.0 版本开始引入

  • 作用域:SESSION
  • 是否持久化到集群:否
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值: 0
  • 范围:[0, 15]
  • 当变量非 0 时,该 SESSION 写入的数据将被视为是由 TiCDC 写入的。这个变量仅由 TiCDC 设置,任何时候都不应该手动调整该变量。

tidb_check_mb4_value_in_utf8

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:ON
  • 设置该变量为 ON 可强制只存储基本多文种平面 (BMP) 编码区段内的 utf8 字符值。若要存储 BMP 区段外的 utf8 值,推荐使用 utf8mb4 字符集。
  • 早期版本的 TiDB 中 (v2.1.x),utf8 检查更为宽松。如果你的 TiDB 集群是从早期版本升级的,推荐关闭该变量,详情参阅升级与升级后常见问题。

tidb_committer_concurrency 从 v6.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:128
  • 范围:[1, 10000]
  • 在单个事务的提交阶段,用于执行提交操作相关请求的 goroutine 数量。
  • 若提交的事务过大,事务提交时的流控队列等待耗时可能会过长。此时,可以通过调大该配置项来加速提交。
  • 在 v6.1.0 之前这个开关通过 TiDB 配置文件 (performance.committer-concurrency) 进行配置,升级到 v6.1.0 时会自动继承原有设置。

tidb_checksum_table_concurrency

  • 作用域:SESSION
  • 是否受 Hint SET_VAR 控制:否
  • 类型:整数型
  • 默认值:4
  • 取值范围:[1, 256]
  • 单位:线程
  • 这个变量用来设置 ADMIN CHECKSUM TABLE 语句执行时扫描索引的并发度。当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。

tidb_config

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 是否受 Hint SET_VAR 控制:否
  • 默认值:””
  • 这个变量是一个只读变量,用来获取当前 TiDB Server 的配置信息。

tidb_constraint_check_in_place

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值:OFF
  • 该变量仅适用于乐观事务模型。悲观事务模式中的行为由 tidb_constraint_check_in_place_pessimistic 控制。
  • 当这个变量设置为 OFF 时,唯一索引的重复值检查会被推迟到事务提交时才进行。这有助于提高性能,但对于某些应用,可能导致非预期的行为。详情见约束。

  • 乐观事务模型下将 tidb_constraint_check_in_place 设置为 OFF:

    1. create table t (i int key); 2. insert into t values (1); 3. begin optimistic; 4. insert into t values (1);

    ``` 1. Query OK, 1 r

(本文超出站点单文档体积上限,已截断)