TiDB 系统变量的行为与 MySQL 相似但有一些不同,变量的作用范围可以是全局范围有效 (Global Scope)、实例级别有效 (Instance Scope) 或会话级别有效 (Session Scope),或组合了上述多个范围。其中:
对 GLOBAL 作用域变量的更改,设置后只对新 TiDB 连接会话生效,当前活动连接会话不受影响。更改会被持久化,重启后仍然生效。
对 INSTANCE 作用域变量的更改,设置后会立即对当前 TiDB 实例所有活动连接会话或新连接会话生效,其他 TiDB 实例不生效。更改不会被持久化,重启 TiDB 后会失效。
使用 SET 语句可以设置变量的作用范围为全局级别、实例级别或会话级别。
# 以下两个语句等价地改变一个 Session 变量SET tidb_distsql_scan_concurrency = 10;SET SESSION tidb_distsql_scan_concurrency = 10;# 以下两个语句等价地改变一个 Global 变量SET @@global.tidb_distsql_scan_concurrency = 10;SET GLOBAL tidb_distsql_scan_concurrency = 10;注意:
- 在 TiDB 中,
GLOBAL变量的设置即使重启后也仍然有效。每隔 2 秒,其他 TiDB server 会获取到对变量设置的更改。详情见 TiDB #14531。- 此外,由于应用和连接器通常需要读 MySQL 变量,为了兼容这一需求,在 TiDB 中,部分 MySQL 5.7 的变量既可读取也可设置。例如,尽管 JDBC 连接器不依赖于查询缓存 (query cache) 的行为,但仍然可以读取和设置查询缓存。
autocommitallow_auto_random_explicit_insert 从 v4.0.3 版本开始引入INSERT 语句中显式指定含有 AUTO_RANDOM 属性的列的值,1 为允许,0 为不允许。ddl_slow_thresholdforeign_key_checkshostnameinnodb_lock_wait_timeoutlast_plan_from_cache 从 v4.0 版本开始引入execute 语句所使用的执行计划是不是直接从 plan cache 中取出来的。last_plan_from_binding 从 v4.0 版本开始引入作用域:SESSION
默认值:0
这个变量用来显示上一条执行的语句所使用的执行计划是不是来自 binding 的执行计划。
max_execution_time注意:
max_execution_time目前对所有类型的语句生效,并非只对SELECT语句生效,与 MySQL 不同(只对SELECT语句生效)。实际精度在 100ms 级别,而非更准确的毫秒级别。
interactive_timeoutCLIENT_INTERACTIVE 选项调用 mysql_real_connect() API 建立的会话(例如:MySQL shell 客户端)。该变量与 MySQL 完全兼容。sql_modeONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONsql_select_limit 从 v4.0.2 版本开始引入2^64 - 1 (18446744073709551615)SELECT 语句返回的最大行数。tidb_allow_batch_cop 从 v4.0 版本开始引入这个变量用于控制 TiDB 向 TiFlash 发送 coprocessor 请求的方式,有以下几种取值:
tidb_allow_remove_auto_inc 从 v2.1.18 和 v3.0.4 版本开始引入ALTER TABLE MODIFY 或 ALTER TABLE CHANGE 来移除某个列的 AUTO_INCREMENT 属性。默认 (0) 为不允许。tidb_auto_analyze_end_time这个变量用来设置一天中允许自动 ANALYZE 更新统计信息的结束时间。例如,只允许在凌晨 1:00 至 3:00 之间自动更新统计信息,可以设置如下:
tidb_auto_analyze_start_time='01:00 +0000'tidb_auto_analyze_end_time='03:00 +0000'tidb_auto_analyze_ratioANALYZE TABLE 更新统计信息的阈值。0.5 指的是当表中超过 50% 的行被修改时,触发自动 ANALYZE 更新。可以指定 tidb_auto_analyze_start_time 和 tidb_auto_analyze_end_time 来限制自动 ANALYZE 的时间注意:
只有在 TiDB 的启动配置文件中开启了
run-auto-analyze选项,该 TiDB 才会触发auto_analyze。
tidb_auto_analyze_start_time这个变量用来设置一天中允许自动 ANALYZE 更新统计信息的开始时间。例如,只允许在凌晨 1:00 至 3:00 之间自动更新统计信息,可以设置如下:
tidb_auto_analyze_start_time='01:00 +0000'tidb_auto_analyze_end_time='03:00 +0000'tidb_backoff_lock_fasttidb_backoff_weight这个变量用来给 TiDB 的 backoff 最大时间增加权重,即内部遇到网络或其他组件(TiKV、PD)故障时,发送重试请求的最大重试时间。可以通过这个变量来调整最大重试时间,最小值为 1。
例如,TiDB 向 PD 取 TSO 的基础超时时间是 15 秒,当 tidb_backoff_weight = 2 时,取 TSO 的最大超时时间为:基础时间 * 2 等于 30 秒。
在网络环境较差的情况下,适当增大该变量值可以有效缓解因为超时而向应用端报错的情况;而如果应用端希望更快地接到报错信息,则应该尽量减小该变量的值。
tidb_capture_plan_baselines 从 v4.0 版本开始引入tidb_check_mb4_value_in_utf81 表示开启检查。这个默认行为和 MySQL 是兼容的。tidb_configtidb_constraint_check_in_place该变量仅适用于乐观事务模型。当这个变量设置为 0 时,唯一索引的重复值检查会被推迟到事务提交时才进行。这有助于提高性能,但对于某些应用,可能导致非预期的行为。详情见约束。
乐观事务模型下将 tidb_constraint_check_in_place 设置为 0:
create table t (i int key); insert into t values (1); begin optimistic; insert into t values (1); Query OK, 1 row affected tidb> commit; -- 事务提交时才检查 ERROR 1062 : Duplicate entry '1' for key 'PRIMARY'乐观事务模型下将 tidb_constraint_check_in_place 设置为 1:
set @@tidb_constraint_check_in_place=1; begin optimistic; insert into t values (1); ERROR 1062 : Duplicate entry '1' for key 'PRIMARY'悲观事务模型中,始终默认执行约束检查。
tidb_current_tstidb_ddl_error_count_limittidb_ddl_reorg_batch_size这个变量用来设置 DDL 操作 re-organize 阶段的 batch size。比如 ADD INDEX 操作,需要回填索引数据,通过并发 tidb_ddl_reorg_worker_cnt 个 worker 一起回填数据,每个 worker 以 batch 为单位进行回填。
ADD INDEX 操作时有较多 UPDATA 操作或者 REPLACE 等更新操作,batch size 越大,事务冲突的概率也会越大,此时建议调小 batch size 的值,最小值是 32。tidb_ddl_reorg_priorityADD INDEX 操作 re-organize 阶段的执行优先级,可设置为 PRIORITY_LOW/PRIORITY_NORMAL/PRIORITY_HIGH。tidb_ddl_reorg_worker_cntre-organize 阶段的并发度。tidb_disable_txn_auto_retry这个变量用来设置是否禁用显式事务自动重试,设置为 on 时,不会自动重试,如果遇到事务冲突需要在应用层重试。
如果将该变量的值设为 off,TiDB 将会自动重试事务,这样在事务提交时遇到的错误更少。需要注意的是,这样可能会导致数据更新丢失。
这个变量不会影响自动提交的隐式事务和 TiDB 内部执行的事务,它们依旧会根据 tidb_retry_limit 的值来决定最大重试次数。
关于是否需要禁用自动重试,请参考重试的局限性。
tidb_enable_amend_pessimistic_txn 从 v4.0.7 版本开始引入这个变量用于控制是否开启 AMEND TRANSACTION 特性。在悲观事务模式下开启该特性后,如果该事务相关的表存在并发 DDL 操作和 SCHEMA VERSION 变更,TiDB 会尝试对该事务进行 amend 操作,修正该事务的提交内容,使其和最新的有效 SCHEMA VERSION 保持一致,从而成功提交该事务而不返回 Information schema is changed 报错。该特性对以下并发 DDL 变更生效:
ADD COLUMN 或 DROP COLUMN 类型的 DDL 操作。MODIFY COLUMN 或 CHANGE COLUMN 类型的 DDL 操作,且只对增大字段长度的操作生效。ADD INDEX 或 DROP INDEX 类型的 DDL 操作,且操作的索引列须在事务开启之前创建。注意:
目前该特性可能造成事务语义的变化,且与 TiDB Binlog 存在部分不兼容的场景,可以参考事务语义行为区别和与 TiDB Binlog 兼容问题汇总了解更多关于该特性的使用注意事项。
tidb_enable_cascades_plannertidb_enable_chunk_rpc 从 v4.0 版本开始引入Chunk 数据编码格式。tidb_enable_fast_analyzeANALYZE 语句的执行时间,则推荐关闭快速分析功能。tidb_enable_index_merge 从 v4.0 版本开始引入tidb_enable_noop_functions 从 v4.0 版本开始引入get_lock 和 release_lock 这两个没有实现的函数。需要注意的是,当前版本的 TiDB 这两个函数永远返回 1。tidb_enable_slow_logtidb_enable_stmt_summary 从 v3.0.4 版本开始引入information_schema.STATEMENTS_SUMMARY 中,用于定位和排查 SQL 性能问题。tidb_enable_table_partition这个变量用来设置是否开启 TABLE PARTITION 特性。目前变量支持以下三种值:
on 表示开启 TiDB 当前已实现了的分区表类型,目前 range partition、hash partition 以及 range column 单列的场景会生效。auto 目前作用和 on 一样。off 表示关闭 TABLE PARTITION 特性,此时语法还是保持兼容,只是创建的表并不是真正的分区表,而是普通的表。注意,目前 TiDB 只支持 range partition 和 hash partition。
tidb_enable_telemetry 从 v4.0.2 版本开始引入0 可以关闭 TiDB 遥测功能。当所有 TiDB 实例都设置 enable-telemetry 为 false 时将忽略该系统变量并总是关闭 TiDB 遥测功能。参阅遥测了解该功能详情。tidb_enable_vectorized_expression 从 v4.0 版本开始引入tidb_enable_window_functiontidb_enable_window_function 设置为 0。tidb_evolve_plan_baselines 从 v4.0 版本开始引入为了减少自动演进对集群的影响,可以进行以下配置:
tidb_evolve_plan_task_max_time,限制每个执行计划运行的最长时间,其默认值为 600s;tidb_evolve_plan_task_start_time 和 tidb_evolve_plan_task_end_time,限制运行演进任务的时间窗口,默认值分别为 00:00 +0000 和 23:59 +0000。tidb_evolve_plan_task_end_time 从 v4.0 版本开始引入tidb_evolve_plan_task_max_time 从 v4.0 版本开始引入tidb_evolve_plan_task_start_time 从 v4.0 版本开始引入tidb_expensive_query_time_thresholdtidb_force_priorityNO_PRIORITY、LOW_PRIORITY、DELAYED 或 HIGH_PRIORITY。tidb_general_log"GENERAL_LOG" 字符串可以定位到该功能在日志中的所有记录。日志会记录以下内容:
conn:当前会话对应的 IDuser:当前会话用户schemaVersion:当前 schema 版本txnStartTS:当前事务的开始时间戳forUpdateTS:事务模型为悲观事务时,SQL 语句的当前时间戳。悲观事务内发生写冲突时,会重试当前执行语句,该时间戳会被更新。重试次数由 max-retry-count 配置。事务模型为乐观事务时,该条目与 txnStartTS 等价。isReadConsistency:当前事务隔离级别是否是读已提交 (RC)current_db:当前数据库名txn_mode:事务模型。可选值:OPTIMISTIC(乐观事务模型),或 PESSIMISTIC(悲观事务模型)sql:当前查询对应的 SQL 语句tidb_build_stats_concurrencyANALYZE 语句执行时并发度。tidb_checksum_table_concurrencyADMIN CHECKSUM TABLE 语句执行时扫描索引的并发度。当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。tidb_distsql_scan_concurrencytidb_hash_join_concurrencytidb_hashagg_final_concurrencytidb_hashagg_partial_concurrencytidb_index_join_batch_sizetidb_index_lookup_concurrencytidb_index_lookup_join_concurrencytidb_index_lookup_sizetidb_index_serial_scan_concurrencytidb_projection_concurrencyProjection 算子的并发度。tidb_window_concurrency 从 v4.0 版本开始引入window 算子的并发度。tidb_union_concurrencyunion 算子的并发度。tidb_init_chunk_sizetidb_isolation_read_engines 从 v4.0 版本开始引入tidb_low_resolution_tsotidb_max_chunk_sizetidb_max_delta_schema_counttidb_mem_quota_querymem-quota-query 配置。tidb_metric_query_range_duration 从 v4.0 版本开始引入METRIC_SCHEMA 时生成的 Prometheus 语句的 range duration,单位为秒。tidb_metric_query_step 从 v4.0 版本开始引入METRIC_SCHEMA 时生成的 Prometheus 语句的 step,单位为秒。tidb_multi_statement_mode 从 v4.0.11 版本开始引入COM_QUERY 调用中执行多个查询。COM_QUERY 调用中执行多个查询。该变量可用作早期 TiDB 版本的升级路径选项。该变量值与是否允许多语句行为的对照表如下:| 客户端设置 | tidb_multi_statement_mode 值 | 是否允许多语句 |
|---|---|---|
| Multiple Statements = ON | OFF | 允许 |
| Multiple Statements = ON | ON | 允许 |
| Multiple Statements = ON | WARN | 允许 |
| Multiple Statements = OFF | OFF | 不允许 |
| Multiple Statements = OFF | ON | 允许 |
| Multiple Statements = OFF | WARN | 允许 + 警告提示 |
注意:
只有默认值
OFF才是安全的。如果用户业务是专为早期 TiDB 版本而设计的,那么需要将该变量值设为ON。如果用户业务需要多语句支持,建议用户使用客户端提供的设置,不要使用tidb_multi_statement_mode变量进行设置。
>
- go-sql-driver (
multiStatements)- Connector/J (
allowMultiQueries)- PHP mysqli (
mysqli_multi_query)
tidb_opt_agg_push_downtidb_opt_correlation_exp_factortidb_opt_correlation_thresholdtidb_opt_distinct_agg_push_downDistinct 的聚合函数(比如 select count(distinct a) from t)下推到 Coprocessor 的优化操作。当查询中带有 Distinct 的聚合操作执行很慢时,可以尝试设置该变量为 1。在以下示例中,tidb_opt_distinct_agg_push_down 开启前,TiDB 需要从 TiKV 读取所有数据,并在 TiDB 侧执行 disctinct。tidb_opt_distinct_agg_push_down 开启后, distinct a 被下推到了 Coprocessor,在 HashAgg_5 里新增里一个 group by 列 test.t.a。
mysql> desc select count(distinct a) from test.t;+-------------------------+----------+-----------+---------------+------------------------------------------+| id | estRows | task | access object | operator info |+-------------------------+----------+-----------+---------------+------------------------------------------+| StreamAgg_6 | 1.00 | root | | funcs:count(distinct test.t.a)->Column#4 || └─TableReader_10 | 10000.00 | root | | data:TableFullScan_9 || └─TableFullScan_9 | 10000.00 | cop[tikv] | table:t | keep order:false, stats:pseudo |+-------------------------+----------+-----------+---------------+------------------------------------------+3 rows in set (0.01 sec)mysql> set session tidb_opt_distinct_agg_push_down = 1;Query OK, 0 rows affected (0.00 sec)mysql> desc select count(distinct a) from test.t;+---------------------------+----------+-----------+---------------+------------------------------------------+| id | estRows | task | access object | operator info |+---------------------------+----------+-----------+---------------+------------------------------------------+| HashAgg_8 | 1.00 | root | | funcs:count(distinct test.t.a)->Column#3 || └─TableReader_9 | 1.00 | root | | data:HashAgg_5 || └─HashAgg_5 | 1.00 | cop[tikv] | | group by:test.t.a, || └─TableFullScan_7 | 10000.00 | cop[tikv] | table:t | keep order:false, stats:pseudo |+---------------------------+----------+-----------+---------------+------------------------------------------+4 rows in set (0.00 sec)tidb_opt_insubq_to_join_and_agg这个变量用来设置是否开启优化规则:将子查询转成 join 和 aggregation。
例如,打开这个优化规则后,会将下面子查询做如下变化:
select * from t where t.a in (select aa from t1);将子查询转成如下 join:
select * from t, (select aa from t1 group by aa) tmp_t where t.a = tmp_t.aa;如果 t1 在列 aa 上有 unique 且 not null 的限制,可以直接改写为如下,不需要添加 aggregation。
select * from t, t1 where t.a=t1.a;tidb_opt_write_row_idINSERT、REPLACE 和 UPDATE 操作 _tidb_rowid 列,默认是不允许操作。该选项仅用于 TiDB 工具导数据时使用。tidb_query_log_max_len示例:
set tidb_query_log_max_len = 20;tidb_pprof_sql_cpu 从 v4.0 版本开始引入tidb_record_plan_in_slow_logtidb_replica_read 从 v4.0 版本开始引入这个变量用于控制 TiDB 读取数据的位置,有以下三个选择:
更多细节,见 Follower Read。
tidb_retry_limittidb_retry_limit = 0 时,也会禁用自动重试。tidb_row_format_version作用域:GLOBAL
默认值:2
控制新保存数据的表数据格式版本。TiDB v4.0 中默认使用版本号为 2 的新表数据格式保存新数据。
但如果从 4.0.0 之前的版本升级到 4.0.0,不会改变表数据格式版本,TiDB 会继续使用版本为 1 的旧格式写入表中,即只有新创建的集群才会默认使用新表数据格式。
需要注意的是修改该变量不会对已保存的老数据产生影响,只会对修改变量后的新写入数据使用对应版本格式保存。
tidb_scatter_region作用域:GLOBAL
默认值:0
TiDB 默认会在建表时为新表分裂 Region。开启该变量后,会在建表语句执行时,同步打散刚分裂出的 Region。适用于批量建表后紧接着批量写入数据,能让刚分裂出的 Region 先在 TiKV 分散而不用等待 PD 进行调度。为了保证后续批量写入数据的稳定性,建表语句会等待打散 Region 完成后再返回建表成功,建表语句执行时间会是关闭该变量的数倍。
tidb_skip_isolation_level_check作用域:SESSION | GLOBAL
默认值:0
开启这个开关之后,如果对 tx_isolation 赋值一个 TiDB 不支持的隔离级别,不会报错,有助于兼容其他设置了(但不依赖于)不同隔离级别的应用。
tidb> set tx_isolation='serializable';ERROR 8048 (HY000): The isolation level 'serializable' is not supported. Set tidb_skip_isolation_level_check=1 to skip this errortidb> set tidb_skip_isolation_level_check=1;Query OK, 0 rows affected (0.00 sec)tidb> set tx_isolation='serializable';Query OK, 0 rows affected, 1 warning (0.00 sec)tidb_skip_utf8_check作用域:SESSION | GLOBAL
默认值:0
这个变量用来设置是否跳过 UTF-8 字符的验证。
验证 UTF-8 字符需要消耗一定的性能,当可以确认输入的字符串为有效的 UTF-8 字符时,可以将其设置为 1。
tidb_slow_log_threshold作用域:INSTANCE
默认值:300
输出慢日志的耗时阈值。当查询大于这个值,就会当做是一个慢查询,输出到慢查询日志。默认为 300 ms。
示例:
set tidb_slow_log_threshold = 200;tidb_enable_collect_execution_info作用域:INSTANCE
默认值:1
这个变量用于控制是否同时将各个执行算子的执行信息记录入 slow query log 中。
tidb_redact_log作用域:SESSION | GLOBAL
默认值:0
这个变量用于控制在记录 TiDB 日志和慢日志时,是否将 SQL 中的用户信息遮蔽。
将该变量设置为 1 即开启后,假设执行的 SQL 为 insert into t values (1,2),在日志中记录的 SQL 会是 insert into t values (?,?),即用户输入的信息被遮蔽。
tidb_slow_query_file作用域:SESSION
默认值:””
查询 INFORMATION_SCHEMA.SLOW_QUERY 只会解析配置文件中 slow-query-file 设置的慢日志文件名,默认是 “tidb-slow.log”。但如果想要解析其他的日志文件,可以通过设置 session 变量 tidb_slow_query_file 为具体的文件路径,然后查询 INFORMATION_SCHEMA.SLOW_QUERY 就会按照设置的路径去解析慢日志文件。更多详情可以参考 SLOW_QUERY 文档。
tidb_snapshot作用域:SESSION
默认值:””
这个变量用来设置当前会话期待读取的历史数据所处时刻。比如当设置为 "2017-11-11 20:20:20" 时或者一个 TSO 数字 “400036290571534337”,当前会话将能读取到该时刻的数据。
tidb_stmt_summary_history_size 从 v4.0 版本开始引入作用域:SESSION | GLOBAL
默认值:24(受配置文件影响,这里给出的是默认配置文件取值)
这个变量设置了 statement summary 的历史记录容量。
tidb_stmt_summary_internal_query 从 v4.0 版本开始引入作用域:SESSION | GLOBAL
默认值:0(受配置文件影响,这里给出的是默认配置文件取值)
这个变量用来控制是否在 statement summary 中包含 TiDB 内部 SQL 的信息。
tidb_stmt_summary_max_sql_length 从 v4.0 版本开始引入作用域:SESSION | GLOBAL
默认值:4096(受配置文件影响,这里给出的是默认配置文件取值)
这个变量控制 statement summary 显示的 SQL 字符串长度。
tidb_stmt_summary_max_stmt_count 从 v4.0 版本开始引入作用域:SESSION | GLOBAL
默认值:200(受配置文件影响,这里给出的是默认配置文件取值)
这个变量设置了 statement summary 在内存中保存的语句的最大数量。
tidb_stmt_summary_refresh_interval 从 v4.0 版本开始引入作用域:SESSION | GLOBAL
默认值:1800(受配置文件影响,这里给出的是默认配置文件取值)
这个变量设置了 statement summary 的刷新时间,单位为秒。
tidb_store_limit 从 v3.0.4 和 v4.0 版本开始引入作用域:INSTANCE | GLOBAL
默认值:0
这个变量用于限制 TiDB 同时向 TiKV 发送的请求的最大数量,0 表示没有限制。
tidb_txn_mode作用域:SESSION | GLOBAL
默认值:”pessimistic”
这个变量用于设置事务模式。TiDB v3.0 支持了悲观事务,自 v3.0.8 开始,默认使用悲观事务模式。
但如果从 3.0.7 及之前的版本升级到 >= 3.0.8 的版本,不会改变默认事务模型,即只有新创建的集群才会默认使用悲观事务模型。
将该变量设置为 “optimistic” 或 “” 时,将会使用乐观事务模式。
tidb_use_plan_baselines 从 v4.0 版本开始引入作用域:SESSION | GLOBAL
默认值:on
这个变量用于控制是否开启执行计划绑定功能,默认打开,可通过赋值 off 来关闭。关于执行计划绑定功能的使用可以参考执行计划绑定文档。
tidb_wait_split_region_finish作用域:SESSION
默认值:1
由于打散 region 的时间可能比较长,主要由 PD 调度以及 TiKV 的负载情况所决定。这个变量用来设置在执行 SPLIT REGION 语句时,是否同步等待所有 region 都打散完成后再返回结果给客户端。默认 1 代表等待打散完成后再返回结果。0 代表不等待 Region 打散完成就返回。
需要注意的是,在 region 打散期间,对正在打散 region 上的写入和读取的性能会有一定影响,对于批量写入,导数据等场景,还是建议等待 region 打散完成后再开始导数据。
tidb_wait_split_region_timeout作用域:SESSION
默认值:300
这个变量用来设置 SPLIT REGION 语句的执行超时时间,单位是秒,默认值是 300 秒,如果超时还未完成,就返回一个超时错误。
time_zonetransaction_isolationREPEATABLE-READ),但实际的隔离级别是快照隔离。详情见事务隔离级别。tx_isolation这个变量是 transaction_isolation 的别名。
versionversion_commentwait_timeout0 代表没有时间限制。windowing_use_high_precisiontidb_enable_rate_limit_actiontidb_disql_scan_concurrency 所允许的最大线程数来读取数据。当单条 SQL 语句的内存使用每超过 tidb_mem_quota_query 一次,读数据的算子会停止一个线程。tidb_mem_quota_query 时,该 SQL 语句会触发其它的内存控制行为。tidb_memory_usage_alarm_ratiomemory-usage-alarm-ratio。memory-usage-alarm-ratio 进行配置。