本次調研主要考慮在應用層面,用 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 等寫入操作。