**
TiDB介绍
**
五大核心特性:
1.一键水平扩展或收缩
2.金融级高可用
3.实时HTAP
4.云原生的分布式数据库
5.兼容Mysql5.7协议和生态
四大核心应用场景:
1.对数据一致性及高可靠、系统高可用、可扩展性、容灾要求较高的金融行业属性的场景
2.对存储容量、可扩展性、并发要求较高的海量数据及高并发的OLTP场景
3.Real-time HTAP场景
4.数据汇聚、二次加工处理的场景
TiDB基本功能
数据类型
• 数值类型:BIT、BOOL|BOOLEAN、SMALLINT、MEDIUMINT、INT|INTEGER、BIGINT、FLOAT、DOUBLE、DECIMAL。
• 日期和时间类型:DATE、TIME、DATETIME、TIMESTAMP、YEAR。
• 字符串类型:CHAR、VARCHAR、TEXT、TINYTEXT、MEDIUMTEXT、LONGTEXT、BINARY、VARBINARY、BLOB、TINYBLOB、MEDIUMBLOB、LONGBLOB、ENUM、SET。
• JSON 类型。
运算符
• 算术运算符、位运算符、比较运算符、逻辑运算符、日期和时间运算符等。
字符集及排序规则
• 字符集:UTF8、UTF8MB4、BINARY、ASCII、LATIN1。
• 排序规则:UTF8MB4_GENERAL_CI、UTF8MB4_UNICODE_CI、UTF8MB4_GENERAL_BIN、UTF8_GENERAL_CI、UTF8_UNICODE_CI、UTF8_GENERAL_BIN、BINARY。
函数
• 控制流函数、字符串函数、日期和时间函数、位函数、数据类型转换函数、数据加解密函数、压缩和解
压函数、信息函数、JSON 函数、聚合函数、窗口函数等。
SQL语句
• 完全支持标准的 Data Definition Language (DDL) 语句,例如:CREATE、DROP、ALTER、RENAME、TRUNCATE 等。
• 完全支持标准的 Data Manipulation Language (DML) 语句,例如:INSERT、REPLACE、SELECT、Subqueries、UPDATE、
LOAD DATA 等。
• 完全支持标准的Transactional and Locking语句,例如:START TRANSACTION、COMMIT、ROLLBACK、SET TRANSACTION
等。
• 完全支持标准的 Database Administration 语句,例如:SHOW、SET 等。
• 完全支持标准的 Utility 语句,例如:DESCRIBE、EXPLAIN、USE 等。
• 完全支持 SQL GROUP BY 和 ORDER BY 子语句。
• 完全支持标准 SQL 语法的 LEFT OUTER JOIN 和 RIGHT OUTER JOIN。
• 完全支持标准 SQL 要求的表和列别名。
分区表
• 支持 Range 分区。
• 支持 Hash 分区。
视图
• 支持普通视图。
约束
• 支持非空约束。
• 支持主键约束。
• 支持唯一约束。
安全
• 支持基于 RBAC (role-based access control) 的权限管理。
• 支持密码管理。
• 支持通信、数据加密。
• 支持 IP 白名单。
• 支持审计功能。
工具
• 支持快速备份功能。
• 支持通过工具从 MySQL 迁移数据到 TiDB。
• 支持通过工具部署、运维 TiDB。
TiDB实验特性
(不建议在生产环境中使用实验特性)
稳定性
调度功能
SQL功能
配置管理
TiDB数据共享订阅
存储
备份与恢复
垃圾回收
与MySQL兼容性对比
• TiDB 100% 兼容 MySQL 5.7 协议、MySQL 5.7 常用的功能及语法。MySQL 5.7 生态中的系统工具(PHPMyAdmin、
Navicat、MySQL Workbench、mysqldump、Mydumper/Myloader)、客户端等均适用于 TiDB。
• 但 TiDB 尚未支持一些 MySQL 功能,可能的原因如下:
– 有更好的解决方案,例如 JSON 取代 XML 函数。
– 目前对这些功能的需求度不高,例如存储流程和函数。
– 一些功能在分布式系统上的实现难度较大。
• 除此以外,TiDB 不支持 MySQL 复制协议,但提供了专用工具用于与 MySQL 复制数据
– 从 MySQL 复制:TiDB Data Migration (DM) 是将 MySQL/MariaDB 数据迁移到 TiDB 的工具,可用于增量数据的复制。
– 向 MySQL 复制:TiCDC 是一款通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具,可通过MySQL sink 将 TiDB 增量数据复制到 MySQL。
不支持的功能特性
• 存储过程与函数
• 触发器
• 事件
• 自定义函数
• 外键约束
• 临时表
• 全文/空间函数与索引
• 非 ascii/latin1/binary/utf8/utf8mb4 的字符集
• SYS schema
• MySQL 追踪优化器
• XML 函数
• X-Protocol
• Savepoints
• 列级权限
• XA 语法(TiDB 内部使用两阶段提交,但并没有通过 SQL 接口公开)
• CREATE TABLE tblName AS SELECT stmt 语法
• CHECK TABLE 语法
• CHECKSUM TABLE 语法
• GET_LOCK 和 RELEASE_LOCK 函数
• LOAD DATA 和 REPLACE 关键字
与 MySQL 有差异的特性详细说明
自增 ID
• TiDB 的自增列仅保证唯一,也能保证在单个 TiDB server 中自增,但不保证多个 TiDB server 中自增,不保证自动分配的值的连续性,建议不要将缺省值和自定义值混用,若混用可能会收 Duplicated Error 的错误信息。
• TiDB 可通过 tidb_allow_remove_auto_inc 系统变量开启或者关闭允许移除列的 AUTO_INCREMENT 属性。删除列属性的语法是:alter table modify 或 alter table change。
• TiDB 不支持添加列的 AUTO_INCREMENT 属性,移除该属性后不可恢复。
Performance schema
TiDB 主要使用 Prometheus 和 Grafana 来存储及查询相关的性能监控指标,所以 Performance schema 部分表是空表。
查询计划
EXPLAIN/EXPLAIN FOR 输出格式、内容、权限设置与 MySQL 有比较大的差别,参见理解 TiDB 执行计划。
内建函数
支持常用的 MySQL 内建函数,有部分函数并未支持。可通过执行 SHOW BUILTINS 语句查看可用的内建函数。
DDL 的限制
TiDB 中,所有支持的 DDL 变更操作都是在线执行的。与 MySQL 相比,TiDB 中的 DDL 存在以下限制:
不能在单条 ALTER TABLE 语句中完成多个操作。例如,不能在单个语句中添加多个列或索引,否则,可能会输出 Unsupported multi schema change 的错误。
不支持不同类型的索引 (HASH|BTREE|RTREE|FULLTEXT)。若指定了不同类型的索引,TiDB 会解析并忽略这些索引。
不支持添加/删除 CLUSTERED 类型的主键。
不支持将字段类型修改为其超集,例如不支持从 INTEGER 修改为 VARCHAR,或者从 TIMESTAMP 修改为DATETIME,否则可能输出的错误信息 Unsupported modify column: type %d not match origin %d。
更改/修改数据类型时,尚未支持 “有损更改”,例如不支持从 BIGINT 更改为 INT。
更改/修改 DECIMAL 类型时,不支持更改精度。
更改/修改整数列时,不允许更改 UNSIGNED 属性。
TiDB 中,ALGORITHM={INSTANT,INPLACE,COPY} 语法只作为一种指定,并不更改 ALTER 算法
分区表支持 Hash、Range 和 Add/Drop/Truncate/Coalesce。其他分区操作将被忽略,可能会报 Warning:
,→ Unsupported partition type, treat as normal table 错误。不支持以下分区表语法:
– PARTITION BY LIST
– PARTITION BY KEY
– SUBPARTITION
– {CHECK|EXCHANGE|TRUNCATE|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD|REORGANIZE} PARTITION
ANALYZE TABLE
TiDB 中的信息统计 与 MySQL 中的有所不同:TiDB 中的信息统计会完全重构表的统计数据,语句执行过程较长,但在 MySQL/InnoDB 中,它是一个轻量级语句,执行过程较短。
SELECT 的限制
• 不支持 SELECT … INTO @变量 语法。
• 不支持 SELECT … GROUP BY … WITH ROLLUP 语法。
• TiDB 中的 SELECT … GROUP BY expr 的返回结果与 MySQL 5.7 并不一致。MySQL 5.7 的结果等价于 GROUP,
→ BY expr ORDER BY expr。而 TiDB 中该语法所返回的结果并不承诺任何顺序,与 MySQL 8.0 的行为一致。
视图
TiDB 中的视图不可更新,不支持 UPDATE、INSERT、DELETE 等写入操作。
存储引擎
• 仅在语法上兼容创建表时指定存储引擎,实际上 TiDB 会将元信息统一描述为 InnoDB 存储引擎。TiDB 支持类似 MySQL 的存储引擎抽象,但需要在系统启动时通过–store 配置项来指定存储引擎。
SQL 模式
TiDB 支持大部分 SQL 模式。不支持的 SQL 模式如下:
•不支持兼容模式,例如:ORACLE 和 POSTGRESQL(TiDB 解析但会忽略这两个兼容模式),MySQL 5.7 已弃用兼容模式,MySQL 8.0 已移除兼容模式。
• TiDB 的 ONLY_FULL_GROUP_BY 模式与 MySQL 5.7 相比有细微的语义差别。
• NO_DIR_IN_CREATE 和 NO_ENGINE_SUBSTITUTION 仅用于解决与 MySQL 的兼容性问题,并不适用于 TiDB。
默认设置
• 字符集:
– TiDB 默认:utf8mb4。
– MySQL 5.7 默认:latin1。
– MySQL 8.0 默认:utf8mb4。
• 排序规则:
– TiDB 中 utf8mb4 字符集默认:utf8mb4_bin。
– MySQL 5.7 中 utf8mb4 字符集默认:utf8mb4_general_ci。
– MySQL 8.0 中 utf8mb4 字符集默认:utf8mb4_0900_ai_ci。
• foreign_key_checks:
– TiDB 默认:OFF,且仅支持设置该值为 OFF。
– MySQL 5.7 默认:ON。
• SQL mode:
– TiDB默认: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 5.7 默认与 TiDB 相同。
– MySQL 8.0 默 认 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,→ ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。
• lower_case_table_names:
– TiDB 默认:2,且仅支持设置该值为 2。
– MySQL 默认如下:
- Linux 系统中该值为 0
- Windows 系统中该值为 1
- macOS 系统中该值为 2
• explicit_defaults_for_timestamp:
– TiDB 默认:ON,且仅支持设置该值为 ON。
– MySQL 5.7 默认:OFF。
– MySQL 8.0 默认:ON。
日期时间处理的区别
时区
• TiDB 采用系统当前安装的所有时区规则进行计算(一般为 tzdata 包),不需要导入时区表数据就能使用
所有时区名称,无法通过导入时区表数据的形式修改计算规则。
• MySQL 默认使用本地时区,依赖于系统内置的当前的时区规则(例如什么时候开始夏令时等)进行计
算;且在未导入时区表数据的情况下不能通过时区名称来指定时区。
类型系统
• 不支持 FLOAT4/FLOAT8。
• 不支持 SQL_TSI_*(包括 SQL_TSI_MONTH、SQL_TSI_WEEK、SQL_TSI_DAY、SQL_TSI_HOUR、SQL_TSI_MINUTE
和 SQL_TSI_SECOND,但不包括 SQL_TSI_YEAR)。
MySQL 弃用功能导致的不兼容问题
TiDB 不支持 MySQL 中标记为弃用的功能,包括:
• 指定浮点类型的精度。MySQL 8.0 弃用了此功能,建议改用 DECIMAL 类型。
• ZEROFILL 属性。MySQL 8.0 弃用了此功能,建议在业务应用中填充数字值。
使用限制
标识符长度限制
标识符类型 最大长度(字符)
Database 64
Table 64
Column 64
Index 64
View 64
Sequence 64
Database、tables、views、connections总个数限制
标识符类型 最大个数
Databases unlimited
Tables unlimited
Views unlimited
Connections unlimited
单个Database的限制
类型 最大限制
Tables unlimited
单个Table的限制
类型 最大限制(默认值)
Columns 默认为 1017,最大可调至 4096
Indexs 默认为 64,最大可调至 512
Rows 无限制
Size 无限制
Partitions 1024
• Columns 的最大限制可通过table-column-count-limit 修改。
• Indexs 的最大限制可通过index-limit 修改。
单行的限制
类型 最大限制
Size 默认为 6MB,可通过txn-entry-size-limit 配置项调整
单列的限制
类型 最大限制
Size 6MB
字符串类型限制
类型 最大限制
CHAR 256 字符
BINARY 256 字节
VARBINARY 65535 字节
VARCHAR 16383 字符
TEXT 6MB 字节
BLOB 6MB 字节
SQL Statements的限制
类型 最大限制
单个事务最大语句数 在使用乐观事务并开启事务重试的情况下,默认限制 5000,可通过stmt-count-limit 调整