title | category |
---|---|
TiDB 专用系统变量和语法 |
compatibility |
TiDB 在 MySQL 的基础上,定义了一些专用的系统变量和语法用来优化性能。
变量可以通过 SET 语句设置,例如
set @@tidb_distsql_scan_concurrency = 10
如果需要设值全局变量,执行
set @@global.tidb_distsql_scan_concurrency = 10
作用域: SESSION
默认值: 空字符串
这个变量用来设置当前会话期待读取的历史数据所处时刻。 比如当设置为 "2017-11-11 20:20:20" 时或者一个 TSO 数字 "400036290571534337",当前会话将能读取到该时刻的数据。
作用域: SESSION
默认值: 0
这个变量用来表示当前状态是否为从 dump 文件中导入数据。 当这个变量被设置为 1 时,唯一索引约束不被检查以加速导入速度。 这个变量不对外用,只是给 lightning 使用,请用户不要自行修改。
作用域: SESSION
默认值: 0
这个变量用来设置优化器是否执行聚合函数下推到 Join 之前的优化操作。 当查询中聚合操作执行很慢时,可以尝试设置该变量为 1。
作用域: SESSION
默认值: 0
这个变量用来设置优化器是否执行 in-子查询展开的优化操作。
作用域: SESSION
默认值: 4
这个变量用来设置 ANALYZE 语句执行时并发度。 当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。
作用域: SESSION
默认值: 4
这个变量用来设置 ADMIN CHECKSUM TABLE 语句执行时扫描索引的并发度。 当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。
作用域: SESSION
默认值: 0
这个变量是一个只读变量,用来获取当前事务的时间戳。
作用域: SESSION
默认值: 空字符串
这个变量是一个只读变量,用来获取当前 TiDB Server 的配置信息。
作用域: SESSION | GLOBAL
默认值: 15
这个变量用来设置 scan 操作的并发度,AP 类应用适合较大的值,TP 类应用适合较小的值。 对于 AP 类应用,最大值建议不要超过所有 TiKV 节点的 CPU 核数。
作用域: SESSION | GLOBAL
默认值: 20000
这个变量用来设置 index lookup 操作的 batch 大小,AP 类应用适合较大的值,TP 类应用适合较小的值。
作用域: SESSION | GLOBAL
默认值: 4
这个变量用来设置 index lookup 操作的并发度,AP 类应用适合较大的值,TP 类应用适合较小的值。
作用域: SESSION | GLOBAL
默认值: 4
这个变量用来设置 index lookup join 算法的并发度。
作用域: SESSION | GLOBAL
默认值: 5
这个变量用来设置 hash join 算法的并发度。
作用域:SESSION | GLOBAL
默认值:1
这个变量用来设置顺序 scan 操作的并发度,AP 类应用适合较大的值,TP 类应用适合较小的值。
作用域:SESSION | GLOBAL
默认值:4
这个变量用来设置 Projection 算子的并发度。
作用域:SESSION | GLOBAL
默认值:4
这个变量用来设置并行 hash aggregation 算法 partial 阶段的执行并发度。对于聚合函数参数不为 distinct 的情况,HashAgg 分为 partial 和 final 阶段分别并行执行。
作用域:SESSION | GLOBAL
默认值:4
这个变量用来设置并行 hash aggregation 算法 final 阶段的执行并发度。对于聚合函数参数不为 distinct 的情况,HashAgg 分为 partial 和 final 阶段分别并行执行。
作用域:SESSION | GLOBAL
默认值:25000
这个变量用来设置 index lookup join 操作的 batch 大小,AP 类应用适合较大的值,TP 类应用适合较小的值。
作用域: SESSION | GLOBAL
默认值: 0
这个变量用来设置是否跳过 UTF-8 字符的验证。 验证 UTF-8 字符需要消耗一定的性能,当可以确认输入的字符串为有效的 UTF-8 字符时,可以将其设置为 1。
作用域: SESSION
默认值: 0
这个变量用来设置是否自动切分插入数据。仅在 autocommit 开启时有效。 当插入大量数据时,可以将其设置为 true,这样插入数据会被自动切分为多个 batch,每个 batch 使用一个单独的事务进行插入。
作用域: SESSION
默认值: 0
这个变量用来设置是否自动切分待删除的数据。仅在 autocommit 开启时有效。 当删除大量数据时,可以将其设置为 true,这样待删除数据会被自动切分为多个 batch,每个 batch 使用一个单独的事务进行删除。
作用域: SESSION
默认值: 20000
这个变量用来设置自动切分插入/待删除数据的的 batch 大小。仅在 tidb_batch_insert 或 tidb_batch_delete 开启时有效。 需要注意的是,当单行总数据大小很大时,20k 行总数据量数据会超过单个事务大小限制。因此在这种情况下,用户应当将其设置为一个较小的值。
作用域: SESSION | GLOBAL
默认值: 1024
这个变量用来设置执行过程中一个 chunk 最大的行数。
作用域:SESSION
默认值:32 GB
这个变量用来设置一条查询语句的内存使用阈值。 如果一条查询语句执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。
作用域:SESSION
默认值:32 GB
这个变量用来设置 HashJoin 算子的内存使用阈值。 如果 HashJoin 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。
作用域:SESSION
默认值:32 GB
这个变量用来设置 MergeJoin 算子的内存使用阈值。 如果 MergeJoin 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。
作用域:SESSION
默认值:32 GB
这个变量用来设置 Sort 算子的内存使用阈值。 如果 Sort 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。
作用域:SESSION
默认值:32 GB
这个变量用来设置 TopN 算子的内存使用阈值。 如果 TopN 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。
作用域:SESSION
默认值:32 GB
这个变量用来设置 IndexLookupReader 算子的内存使用阈值。
如果 IndexLookupReader 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。
作用域:SESSION
默认值:32 GB
这个变量用来设置 IndexLookupJoin 算子的内存使用阈值。 如果 IndexLookupJoin 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。
作用域:SESSION
默认值:32 GB
这个变量用来设置 NestedLoopApply 算子的内存使用阈值。 如果 NestedLoopApply 算子执行过程中使用的内存空间超过该阈值,会触发 TiDB 启动配置文件中 OOMAction 项所指定的行为。
作用域:SERVER
默认值:0
这个变量用来设置是否在日志里记录所有的 SQL 语句。
作用域:SESSION
默认值:0
这个变量用来设置是否启用 Streaming。
作用域:SESSION | GLOBAL
默认值:10
这个变量用来设置最多可重试次数, 即在一个事务执行中遇到可重试的错误(例如事务冲突、TiKV 繁忙等)时,这个事务可以被重新执行,这个变量值表明最多可重试的次数。
作用域:SESSION | GLOBAL
默认值:0
这个变量用来设置是否禁用显式事务自动重试,设置为 1 时,不会自动重试,如果遇到冲突需要在应用层重试。 是否需要禁用自动重试,请参考自动重试的风险
作用域:SESSION
默认值:0
这个变量用来设置是否开启 TABLE PARTITION 特性。
作用域:SESSION | GLOBAL
默认值:100
这个变量用来设置读请求遇到锁的 backoff 时间。
作用域: SESSION | GLOBAL
默认值:16
这个变量用来设置 DDL 操作 re-organize 阶段的并发度。
作用域:SESSION | GLOBAL
默认值:PRIORITY_NORMAL
这个变量用来设置 ADD INDEX
操作 re-organize 阶段的执行优先级,可设置为 PRIORITY_LOW/PRIORITY_NORMAL/PRIORITY_HIGH。
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
SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1,t2 where t1.id = t2.id
提示优化器使用 Sort Merge Join 算法,这个算法通常会占用更少的内存,但执行时间会更久。 当数据量太大,或系统内存不足时,建议尝试使用。
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作为驱动表构建查询计划。
SELECT /*+ TIDB_HJ(t1, t2) */ * from t1,t2 where t1.id = t2.id
提示优化器使用 Hash Join 算法,这个算法多线程并发执行,执行速度较快,但会消耗较多内存。
这个是一个 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;
这个 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;