在应用层面,用 TiDB 替代 MySQL 的可行性调研
本次调研主要考虑在应用层面,用 TiDB 替代 MySQL 的可行性。
1 数据类型
1.1 数值类型
Type | TiDB | MySQL |
---|---|---|
BIT | √ | √ |
BOOL/BOOLEAN | √ | √ |
TINYINT | x | √ |
SMALLINT | √ | √ |
MEDIUMINT | √ | √ |
INT/INTEGER | √ | √ |
BIGINT | √ | √ |
FLOAT | √ | √ |
DOUBLE | √ | √ |
DECIMAL | √ | √ |
在 TiDB 中,
FLOAT
数据类型默认的精度是 8 位,这与 MySQL 不同。在 MySQL 中,FLOAT
数据类型默认的精度是 6 位。
1.2 日期和时间类型
Type | TiDB | MySQL |
---|---|---|
DATE | √ | √ |
TIME | √ | √ |
DATETIME | √ | √ |
TIMESTAMP | √ | √ |
YEAR | √ | √ |
1.3 字符串类型
Type | TiDB | MySQL |
---|---|---|
CHAR/VARCHAR | √ | √ |
BINARY/VARBINARY | √ | √ |
TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB | √ | √ |
TINYTEXT/TEXT/MEDIUMTEXT/LONGTEXT | √ | √ |
ENUM | √ | √ |
SET | √ | √ |
1.4 其他类型
Type | TiDB | MySQL |
---|---|---|
JSON | √ | √ |
Spatial Data Types | x | √ |
TiDB v4.0(Stable)
版本中JSON功能为实验特性,不建议在生产环境中使用。
2、数据比较(函数与操作符)
TiDB 中函数和操作符使用方法与
MySQL
基本一致。涉及上一小节所述数据类型的比较,TiDB 与MySQL v5.7
大致相同。下面列出部分差异:
2.1 TiDB 不支持函数
- 字符串函数
- LOAD_FILE()
- MATCH
- SOUNDEX()
- SOUNDS LIKE
- WEIGHT_STRING()
- 加密和压缩函数
- 在 MySQL 5.7 中被废弃,并且已在 MySQL 8.0 中移除的函数:DES_DECRYPT()、DES_ENCRYPT()、OLD_PASSWORD() 和 ENCRYPT()
- VALIDATE_PASSWORD_STRENGTH()
- 其他仅在
MySQL
企业版中支持的函数
- 信息函数
- CHARSET()
- COERCIBILITY()
- COLLATION()
JSON
函数(TiDB v4.0
版本的实验性功能)- JSON_MERGE_PATCH
- JSON_PRETTY
- JSON_ARRAYAGG
GROUP BY
修饰符,例如WITH ROLLUP
,将来会提供支持(参阅#4250)- 其他函数
- GET_LOCK()
- RELEASE_LOCK()
- UUID_SHORT()
- MASTER_WAIT_POS()
3 数据结构
3.1 外键约束
为了便于其他数据库向TiDB 迁移,TiDB 支持在建表时创建外键约束,也支持使用ALTER TABLE
命令来删除外键(DROP FOREIGN KEY
)和添加外键(ADD FOREIGN KEY
)。但是,TiDB 不会在DML语句
中对外键进行约束检查。
3.2 视图
TiDB 中把视图视为一张虚拟表,用于隐藏底层表敏感字段和数据,以及简化查询。 TiDB 在真正执行查询视图时,会将视图展开成创建视图时定义的 SELECT 语句,进而执行展开后的查询语句。
对视图的操作仅限于create
、drop
以及使用SHOW CREATE TABLE view_name
、SHOW CREATE VIEW view_name
、INFORMATION_SCHEMA.VIEWS
等查看视图的相关信息。
TiDB 中视图为只读视图,不支持对视图进行 UPDATE、INSERT、DELETE、TRUNCATE 等写入操作。