• TiDB 专用系统变量和语法
    • System Variable
      • tidb_snapshot
      • tidb_import_data
      • tidb_opt_agg_push_down
      • tidb_opt_insubquery_unfold
      • tidb_build_stats_concurrency
      • tidb_checksum_table_concurrency
      • tidb_current_ts
      • tidb_config
      • tidb_distsql_scan_concurrency
      • tidb_index_lookup_size
      • tidb_index_lookup_concurrency
      • tidb_index_lookup_join_concurrency
      • tidb_hash_join_concurrency
      • tidb_index_serial_scan_concurrency
      • tidb_index_join_batch_size
      • tidb_skip_utf8_check
      • tidb_batch_insert
      • tidb_batch_delete
      • tidb_dml_batch_size
      • tidb_max_chunk_size
      • tidb_mem_quota_query
      • tidb_mem_quota_hashjoin
      • tidb_mem_quota_mergejoin
      • tidb_mem_quota_sort
      • tidb_mem_quota_topn
      • tidb_mem_quota_indexlookupreader
      • tidb_mem_quota_indexlookupjoin
      • tidb_mem_quota_nestedloopapply
      • tidb_general_log
      • tidb_enable_streaming
      • tidb_retry_limit
    • Optimizer Hint
      • TIDB_SMJ(t1, t2)
      • TIDB_INLJ(t1, t2)
      • TIDB_HJ(t1, t2)
    • _tidb_rowid
    • SHARD_ROW_ID_BITS

    TiDB 专用系统变量和语法

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

    System Variable

    变量可以通过 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

    默认值: 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_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_batch_insert

    作用域: SESSION

    默认值: 0

    这个变量用来设置是否自动切分插入数据。仅在 autocommit 开启时有效。
    当插入大量数据时,可以将其设置为 true,这样插入数据会被自动切分为多个 batch,每个 batch 使用一个单独的事务进行插入。

    tidb_batch_delete

    作用域: SESSION

    默认值: 0

    这个变量用来设置是否自动切分待删除的数据。仅在 autocommit 开启时有效。
    当删除大量数据时,可以将其设置为 true,这样待删除数据会被自动切分为多个 batch,每个 batch 使用一个单独的事务进行删除。

    tidb_dml_batch_size

    作用域: SESSION

    默认值: 20000

    这个变量用来设置自动切分插入/待删除数据的的 batch 大小。仅在 tidb_batch_insert 或 tidb_batch_delete 开启时有效。
    需要注意的是,当单行总数据大小很大时,20k 行总数据量数据会超过单个事务大小限制。因此在这种情况下,用户应当将其设置为一个较小的值。

    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 繁忙等)时,这个事务可以被重新执行,这个变量值表明最多可重试的次数。

    Optimizer Hint

    TiDB 在 MySQL 的 Optimizer Hint 语法上,增加了一些 TiDB 专有的 Hint 语法, 使用这些 Hint 的时候,TiDB 优化器会尽量使用指定的算法,在某些场景下会比默认算法更优。

    由于 hint 包含在类似 /*+ xxx */ 的 comment 里,MySQL 客户端在 5.7.7 之前,会默认把 comment 清除掉,如果需要在旧的客户端使用 hint,需要在启动客户端时加上
    --comments 选项,例如 mysql -h 127.0.0.1 -P 4000 -uroot --comments

    TIDB_SMJ(t1, t2)

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

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

    TIDB_INLJ(t1, t2)

    SELECT /*+ TIDB_INLJ(t1, t2) */ * from t1,t2 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 t1,t2 where t1.id = t2.id
    提示优化器使用 Hash Join 算法,这个算法多线程并发执行,执行速度较快,但会消耗较多内存。

    _tidb_rowid

    这个是一个 TiDB 的隐藏列,代表隐式的 ROW ID 的列名,只存在于 PK 非整数或没有 PK 的表上,可以进行增减改查的操作。

    SELECT 语句示例:SELECT *, _tidb_rowid from t;

    INSERT 语句示例:INSERT t (c, _tidb_rowid) VALUES (1, 1);

    UPDATE 语句示例:UPDATE t SET c = c + 1 WHERE _tidb_rowid = 1;

    DELETE 语句示例:DELETE FROM t WHERE _tidb_rowid = 1;

    SHARD_ROW_ID_BITS

    这个 TABLE OPTION 是用来设置隐式 _tidb_rowid 的分片数量的 bit 位数。

    对于 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 TABLE 语句示例: CREATE TABLE t (c int) SHARD_ROW_ID_BITS = 4;

    ALTER TABLE 语句示例: ALTER TABLE t SHARD_ROW_ID_BITS = 4;