與 MySQL 兼容性對比
更新時間 2025-01-25 10:10:06
最近更新時間: 2025-01-25 10:10:06
分享文章
本頁對分布式融合數據庫HTAP和 MySQL 二者之間的語法、功能特性上做出詳細的對比。
分布式融合數據庫HTAP高度兼容 MySQL 5.7 的網絡協議、SQL功能及語法,以及生態工具(如PHPMyAdmin、Navicat、MySQL Workbench、mysqldump、Mydumper/Myloader)。MySQL 5.7 的客戶端等均適用于分布式融合數據庫HTAP。下面介紹分布式融合數據庫HTAP與 MySQL 兼容性對比。
不支持的功能特性
- 存儲過程與函數
- 觸發器
- 事件
- 自定義函數
- 外鍵約束
- 全文語法與索引
- 空間類型的函數(即 GIS/GEOMETRY)、數據類型和索引
- 非 ascii、latin1、binary、utf8、utf8mb4、gbk 的字符集
- SYS schema
- MySQL 追蹤優化器
- XML 函數
- X-Protocol
- 列級權限
- XA 語法
- CREATE TABLE tblName AS SELECT stmt 語法
- CHECK TABLE 語法
- CHECKSUM TABLE 語法
- REPAIR TABLE 語法
- OPTIMIZE TABLE 語法
- HANDLER 語句
- CREATE TABLESPACE 語句
- MySQL 復制協議
有差異的功能特性
自增 ID
- 自增列既能保證唯一,也能保證在單個計算節點中自增,使用 AUTO_INCREMENT MySQL兼容模式能保證多個計算節點中自增ID,但不保證自動分配的值的連續性。建議避免將缺省值和自定義值混用,以免出現 Duplicated Error 的錯誤信息。
- 可通過系統變量開啟或者關閉允許移除列的 AUTO_INCREMENT 屬性。刪除列屬性的語法是:ALTER TABLE MODIFY 或 ALTER TABLE CHANGE。
- 不支持添加列的 AUTO_INCREMENT 屬性,移除該屬性后不可恢復。
Performance schema
主要使用Prometheus 體系產品來存儲及查詢相關的性能監控指標,所以 Performance schema 部分表是空表。
查詢計劃
執行計劃在輸出格式、內容、權限設置方面與MySQL 有較大差別。
系統變量optimizer_switch 是只讀的,對查詢計劃沒有影響。
內建函數
支持常用的MySQL 內建函數,有部分函數并未支持。可通過執行 SHOW BUILTINS 語句查看可用的內建函數。
DDL 的限制
所有支持的DDL 變更操作都是在線執行的,且存在以下限制:
- 使用 ALTER TABLE 語句修改一個表的多個模式對象(如列、索引)時,不允許在多個更改中指定同一個模式對象。例如,ALTER TABLE t1 MODIFY COLUMN c1 INT, DROP COLUMN c1在兩個更改中都指定了c1列,執行該語句會輸出 Unsupported operate same column/index 的錯誤。
- 不支持使用單個 ALTER TABLE 語句同時修改多個特有的模式對象,包括TIFLASH REPLICA,SHARD_ROW_ID_BITS,AUTO_ID_CACHE 等。
- ALTER TABLE 不支持少部分類型的變更。比如,不支持從 DECIMAL 到 DATE 的變更。當遇到不支持的類型變更時,將會報 Unsupported modify column: type %d not match origin %d 的錯誤。
- ALGORITHM={INSTANT,INPLACE,COPY} 語法只作為一種指定,并不更改ALTER 算法。
- 不支持添加或刪除 CLUSTERED 類型的主鍵。
- 不支持指定不同類型的索引 (HASH|BTREE|RTREE|FULLTEXT)。若指定了不同類型的索引,會解析并忽略這些索引。
- 分區表支持 HASH、RANGE、LIST 和 KEY 分區類型。KEY分區類型暫不支持分區字段列表為空的語句。對于不支持的分區類型,會報 Warning: Unsupported partition type %s, treat as normal table 錯誤,其中%s 為不支持的具體分區類型。
- Range、Range COLUMNS、List、List COLUMNS 分區表支持 ADD、DROP、TRUNCATE、REORGANIZE 操作,其他分區操作會被忽略。
- Hash 和 Key 分區表支持 ADD、COALESCE、TRUNCATE 操作,其他分區操作會被忽略。
- 不支持以下分區表語法:
- SUBPARTITION
- {CHECK|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD} PARTITION
SELECT 的限制
- 不支持 SELECT ... INTO @變量 語法。
- 不支持 SELECT ... GROUP BY ... WITH ROLLUP 語法。
- SELECT .. GROUP BY expr 的返回結果與 MySQL 5.7 不一致,MySQL 5.7 的結果等價于 GROUP BY expr ORDER BY expr。
視圖
視圖不可更新,不支持UPDATE、INSERT、DELETE 等寫入操作。
臨時表
分布式融合數據庫HTAP的臨時表分為本地臨時表和全局臨時表:
- 本地臨時表的表定義和表內數據只對當前會話可見,適用于暫存會話內的中間數據。
- 全局臨時表的表定義對整個集群可見,表內數據只對當前事務可見,適用于暫存事務內的中間數據。
本地臨時表的語義與MySQL 臨時表類似,但有以下方面不兼容:
- 本地臨時表不支持 ALTER TABLE。
- 本地臨時表忽略 ENGINE 表選項,始終在內存中暫存臨時表數據,并且有內存限制。
- 當聲明存儲引擎為 MEMORY 時,本地臨時表沒有 MEMORY 存儲引擎的限制。
- 當聲明存儲引擎為 INNODB 或 MYISAM 時,本地臨時表忽略 InnoDB 臨時表特有的系統變量。
- MySQL 不允許在同一條 SQL 中多次引用同一張臨時表,而本地臨時表沒有該限制。
- MySQL 中用于顯示臨時表的 information_schema.INNODB_TEMP_TABLE_INFO 表在分布式融合數據庫HTAP中不存在。
- 不支持MySQL內部臨時表及相關系統變量。
存儲引擎
- 僅在語法上兼容創建表時指定存儲引擎,實際上會將元信息統一描述為 InnoDB 存儲引擎。
SQL 模式
- 不支持兼容模式,例如:Oracle 和 PostgreSQL(會解析并忽略這兩個兼容模式),MySQL 5.7 已棄用兼容模式,MySQL 8.0 已移除兼容模式。
- 不適用NO_DIR_IN_CREATE和NO_ENGINE_SUBSTITUTION。
默認設置
-
字符集:
- 分布式融合數據庫HTAP默認:utf8mb4。
- MySQL 5.7 默認:latin1。
- MySQL 8.0 默認:utf8mb4。
-
排序規則:
- 分布式融合數據庫HTAP中 utf8mb4 字符集默認:utf8mb4_bin。
- MySQL 5.7 中 utf8mb4 字符集默認:utf8mb4_general_ci。
- MySQL 8.0 中 utf8mb4 字符集默認:utf8mb4_0900_ai_ci。
-
SQL mode:
- 分布式融合數據庫HTAP默認: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 默認與分布式融合數據庫HTAP相同。
- 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:
- 分布式融合數據庫HTAP默認:2,且僅支持設置該值為
2。 - MySQL 默認如下:
- Linux 系統中該值為 0。
- Windows 系統中該值為 1。
- macOS 系統中該值為 2。
- 分布式融合數據庫HTAP默認:2,且僅支持設置該值為
-
explicit_defaults_for_timestamp:
- 分布式融合數據庫HTAP默認:ON,且僅支持設置該值為 ON。
- MySQL 5.7 默認:OFF。
- MySQL 8.0 默認:ON。
時區
- 采用系統當前安裝的所有時區規則進行計算(一般為 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 已棄用功能
- 指定浮點類型的精度。MySQL 8.0 已棄用,建議改用 DECIMAL 類型。
- ZEROFILL 屬性。 MySQL 8.0 已棄用,建議在業務應用中填充數字值。