TiDB 特有的函数

    本文档介绍 TiDB 特有的函数。

    是 TiDB 的内部函数,用于指定一个时间范围。用法为 TIDB_BOUNDED_STALENESS(t1, t2),其中 t1 和 t2 为时间范围的两端,支持使用日期时间和时间函数。

    使用该函数,TiDB 会在指定的时间范围内选择一个合适的时间戳,该时间戳能保证所访问的副本上不存在开始于这个时间戳之前且还没有提交的相关事务,即能保证所访问的可用副本上执行读取操作而且不会被阻塞。

    TIDB_DECODE_KEY

    TIDB_DECODE_KEY 函数用于将 TiDB 编码的键输入解码为包含 _tidb_rowidtable_id 的 JSON 结构。你可以在一些系统表和日志输出中找到 TiDB 的编码键。

    示例

    以下示例中,表 t1 有一个隐藏的 rowid,该 rowid 由 TiDB 生成。语句中使用了 TIDB_DECODE_KEY 函数。结果显示,隐藏的 rowid 被解码后并输出,这是典型的非聚簇主键结果。

    1. SELECT START_KEY, TIDB_DECODE_KEY(START_KEY) FROM information_schema.tikv_region_status WHERE table_name='t1' AND REGION_ID=2\G
    1. *************************** 1. row ***************************
    2. START_KEY: 7480000000000000FF3B5F728000000000FF1DE3F10000000000FA
    3. TIDB_DECODE_KEY(START_KEY): {"_tidb_rowid":1958897,"table_id":"59"}
    4. 1 row in set (0.00 sec)

    以下示例中,表 t2 有一个复合聚簇主键。由 JSON 输出可知,输出结果的 handle 项中包含了主键部分两列的信息,即两列的名称和对应的值。

    1. show create table t2\G
    1. *************************** 1. row ***************************
    2. Table: t2
    3. Create Table: CREATE TABLE `t2` (
    4. `id` binary(36) NOT NULL,
    5. `a` tinyint(3) unsigned NOT NULL,
    6. `v` varchar(512) DEFAULT NULL,
    7. PRIMARY KEY (`a`,`id`) /*T![clustered_index] CLUSTERED */
    8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
    9. 1 row in set (0.001 sec)
      1. *************************** 1. row ***************************
      2. REGION_ID: 48
      3. START_KEY: 7480000000000000FF3E5F720400000000FF0000000601633430FF3338646232FF2D64FF3531632D3131FF65FF622D386337352DFFFF3830653635303138FFFF61396265000000FF00FB000000000000F9
      4. END_KEY:
      5. TABLE_ID: 62
      6. DB_NAME: test
      7. TABLE_NAME: t2
      8. IS_INDEX: 0
      9. INDEX_ID: NULL
      10. INDEX_NAME: NULL
      11. EPOCH_CONF_VER: 1
      12. EPOCH_VERSION: 38
      13. WRITTEN_BYTES: 0
      14. READ_BYTES: 0
      15. APPROXIMATE_SIZE: 136
      16. APPROXIMATE_KEYS: 479905
      17. REPLICATIONSTATUS_STATE: NULL
      18. REPLICATIONSTATUS_STATEID: NULL
      19. 1 row in set (0.005 sec)

      MySQL 兼容性

      TIDB_DECODE_KEY 是 TiDB 特有的函数,和 MySQL 不兼容。

      语法图

      1. TableStmt ::=
      2. "TIDB_DECODE_PLAN(" STR ")"

      示例

      1. SELECT tidb_decode_plan('8QIYMAkzMV83CQEH8E85LjA0CWRhdGE6U2VsZWN0aW9uXzYJOTYwCXRpbWU6NzEzLjHCtXMsIGxvb3BzOjIsIGNvcF90YXNrOiB7bnVtOiAxLCBtYXg6IDU2OC41wgErRHByb2Nfa2V5czogMCwgcnBjXxEpAQwFWBAgNTQ5LglZyGNvcHJfY2FjaGVfaGl0X3JhdGlvOiAwLjAwfQkzLjk5IEtCCU4vQQoxCTFfNgkxXzAJMwm2SGx0KHRlc3QudC5hLCAxMDAwMCkNuQRrdgmiAHsFbBQzMTMuOMIBmQnEDDk2MH0BUgEEGAoyCTQzXzUFVwX1oGFibGU6dCwga2VlcCBvcmRlcjpmYWxzZSwgc3RhdHM6cHNldWRvCTk2ISE2aAAIMTUzXmYA')\G
      1. *************************** 1. row ***************************
      2. tidb_decode_plan('8QIYMAkzMV83CQEH8E85LjA0CWRhdGE6U2VsZWN0aW9uXzYJOTYwCXRpbWU6NzEzLjHCtXMsIGxvb3BzOjIsIGNvcF90YXNrOiB7bnVtOiAxLCBtYXg6IDU2OC41wgErRHByb2Nfa2V5czogMCwgcnBjXxEpAQwFWBAgNTQ5LglZyGNvcHJfY2FjaGVfaGl0X3JhdGlvOiAwLjAwfQkzLjk5IEtCCU4vQQoxCTFfNgkxXz: id task estRows operator info actRows execution info memory disk
      3. TableReader_7 root 319.04 data:Selection_6 960 time:713.1µs, loops:2, cop_task: {num: 1, max: 568.5µs, proc_keys: 0, rpc_num: 1, rpc_time: 549.1µs, copr_cache_hit_ratio: 0.00} 3.99 KB N/A
      4. └─Selection_6 cop[tikv] 319.04 lt(test.t.a, 10000) 960 tikv_task:{time:313.8µs, loops:960} N/A N/A
      5. └─TableFullScan_5 cop[tikv] 960 table:t, keep order:false, stats:pseudo 960 tikv_task:{time:153µs, loops:960} N/A N/A

      MySQL 兼容性

      TIDB_DECODE_PLAN 是 TiDB 特有的函数,和 MySQL 不兼容。

      TIDB_IS_DDL_OWNER

      TIDB_IS_DDL_OWNER 函数用于检查你连接的 TiDB 实例是否是 DDL Owner。DDL Owner 代表集群中所有其他节点执行 DDL 语句的 TiDB 实例。

      语法图

      1. TableStmt ::=
      2. "TIDB_IS_DDL_OWNER())"
      1. SELECT tidb_is_ddl_owner();
      1. +---------------------+
      2. | tidb_is_ddl_owner() |
      3. +---------------------+
      4. | 1 |
      5. +---------------------+
      6. 1 row in set (0.00 sec)

      MySQL 兼容性

      TIDB_IS_DDL_OWNER 是 TiDB 特有的函数,和 MySQL 不兼容。

      另请参阅

      TIDB_PARSE_TSO 函数用于从 TiDB TSO 时间戳中提取物理时间戳。

      TSO 指 Time Stamp Oracle,是 PD (Placement Driver) 为每个事务提供的单调递增的时间戳。

      TSO 是一串数字,包含以下两部分:

      • 一个物理时间戳
      • 一个逻辑计数器

      语法图

      1. TableStmt ::=
      2. "TIDB_PARSE_TSO(" NUM ")"

      示例

      1. | TIDB_PARSE_TSO(@@tidb_current_ts) |
      2. +-----------------------------------+
      3. | 2021-05-26 11:33:37.776000 |
      4. +-----------------------------------+
      5. 1 row in set (0.0012 sec)

      以上示例使用 TIDB_PARSE_TSO 函数从 tidb_current_ts 会话变量提供的可用时间戳编号中提取物理时间戳。因为每个事务都会分配到时间戳,所以此函数在事务中运行。

      MySQL 兼容性

      另请参阅

      TIDB_VERSION

      TIDB_VERSION 函数用于获取当前连接的 TiDB 服务器版本和构建详细信息。向 GitHub 上提交 issue 时,你可使用此函数获取相关信息。

      1. TableStmt ::=
      2. "TIDB_VERSION()"

      示例

      1. SELECT TIDB_VERSION()\G
      1. *************************** 1. row ***************************
      2. TIDB_VERSION(): Release Version: v5.1.0-alpha-13-gd5e0ed0aa-dirty
      3. Edition: Community
      4. Git Commit Hash: d5e0ed0aaed72d2f2dfe24e9deec31cb6cb5fdf0
      5. Git Branch: master
      6. UTC Build Time: 2021-05-24 14:39:20
      7. GoVersion: go1.13
      8. TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
      9. Check Table Before Drop: false
      10. 1 row in set (0.00 sec)

      MySQL 兼容性

      TIDB_VERSION 是 TiDB 特有的函数,和 MySQL 不兼容。如果要求兼容 MySQL,可以使用 VERSION 获取版本信息,但结果不包含详细的构建信息。

      TIDB_DECODE_SQL_DIGESTS 函数用于在集群中查询一组 SQL Digest 所对应的 SQL 语句的归一化形式(即去除格式和参数后的形式)。函数接受 1 个或 2 个参数:

      • digests:字符串类型,该参数应符合 JSON 字符串数组的格式,数组中的每个字符串应为一个 SQL Digest。
      • stmtTruncateLength:可选参数,整数类型,用来限制返回结果中每条 SQL 语句的长度,超过指定的长度会被截断。0 表示不限制长度。

      返回一个字符串,符合 JSON 字符串数组的格式,数组中的第 i 项为参数 digests 中的第 i 个元素所对应的语句。如果参数 digests 中的某一项不是一个有效的 SQL Digest 或系统无法查询到其对应的 SQL 语句,则返回结果中对应项为 null。如果指定了截断长度(stmtTruncateLength > 0),则返回结果中每条超过该长度的语句,保留前 stmtTruncateLength 个字符,并在尾部增加 "..." 后缀表示发生了截断。如果参数 digestsNULL,则函数的返回值为 NULL

      语法图

      1. DecodeSQLDigestsExpr ::=
      2. "TIDB_DECODE_SQL_DIGESTS" "(" digests ( "," stmtTruncateLength )? ")"

      示例

      1. set @digests = '["e6f07d43b5c21db0fbb9a31feac2dc599787763393dd5acbfad80e247eb02ad5","38b03afa5debbdf0326a014dbe5012a62c51957f1982b3093e748460f8b00821","e5796985ccafe2f71126ed6c0ac939ffa015a8c0744a24b7aee6d587103fd2f7"]';
      2. select tidb_decode_sql_digests(@digests);
      1. +------------------------------------+
      2. | tidb_decode_sql_digests(@digests) |
      3. +------------------------------------+
      4. | ["begin",null,"select * from `t`"] |
      5. +------------------------------------+
      6. 1 row in set (0.00 sec)

      上面的例子中,参数是一个包含 3 个 SQL Digest 的 JSON 数组,其对应的 SQL 语句分别为查询结果中给出的三项。但是其中第二条 SQL Digest 所对应的 SQL 语句未能从集群中找到,因而结果中的第二项为 null

      1. +---------------------------------------+
      2. | tidb_decode_sql_digests(@digests, 10) |
      3. +---------------------------------------+
      4. | ["begin",null,"select * f..."] |
      5. +---------------------------------------+
      6. 1 row in set (0.01 sec)

      上述调用指定了第二个参数(即截断长度)为 10,而查询结果中的第三条语句的长度大于 10,因而仅保留了前 10 个字符,并在尾部添加了 "..." 表示发生了截断。

      MySQL 兼容性

      另请参阅