当前位置:网站首页>TiDB与 MySQL 兼容性对比
TiDB与 MySQL 兼容性对比
2022-06-27 06:08:00 【添香小铺】
TiDB 高度兼容 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。
注意
本页内容仅涉及 MySQL 与 TiDB 的总体差异。关于安全特性、悲观事务模式相关的兼容信息请查看各自具体页面。
不支持的功能特性
- 存储过程与函数
- 触发器
- 事件
- 自定义函数
- 外键约束 #18209
- 全文语法与索引 #1793
- 空间类型的函数(即
GIS/GEOMETRY)、数据类型和索引 #6347 - 非
ascii、latin1、binary、utf8、utf8mb4、gbk的字符集 - SYS schema
- MySQL 追踪优化器
- XML 函数
- X-Protocol #1109
- Savepoints #6840
- 列级权限 #9766
XA语法(TiDB 内部使用两阶段提交,但并没有通过 SQL 接口公开)CREATE TABLE tblName AS SELECT stmt语法 #4754CHECK TABLE语法 #4673CHECKSUM TABLE语法 #1895REPAIR TABLE语法OPTIMIZE TABLE语法HANDLER语句CREATE TABLESPACE语句
与 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属性,移除该属性后不可恢复。
自增 ID 详情可参阅 AUTO_INCREMENT。
注意
若创建表时没有指定主键时,TiDB 会使用 _tidb_rowid 来标识行,该数值的分配会和自增列(如果存在的话)共用一个分配器。如果指定了自增列为主键,则 TiDB 会用该列来标识行。因此会有以下的示例情况:
mysql> CREATE TABLE t(id INT UNIQUE KEY AUTO_INCREMENT); Query OK, 0 rows affected (0.05 sec) mysql> INSERT INTO t VALUES(),(),(); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT _tidb_rowid, id FROM t; +-------------+------+ | _tidb_rowid | id | +-------------+------+ | 4 | 1 | | 5 | 2 | | 6 | 3 | +-------------+------+ 3 rows in set (0.01 sec)
注意
使用 AUTO_INCREMENT 可能会给生产环境带热点问题,因此推荐使用 AUTO_RANDOM 代替。详情请参考 TiDB 热点问题处理。
Performance schema
TiDB 主要使用 Prometheus 和 Grafana 来存储及查询相关的性能监控指标,所以 Performance schema 部分表是空表。
查询计划
EXPLAIN/EXPLAIN FOR 输出格式、内容、权限设置与 MySQL 有比较大的差别,参见理解 TiDB 执行计划。
内建函数
支持常用的 MySQL 内建函数,有部分函数并未支持。可通过执行 SHOW BUILTINS 语句查看可用的内建函数。参考 SQL 语法文档。
DDL 的限制
TiDB 中,所有支持的 DDL 变更操作都是在线执行的。与 MySQL 相比,TiDB 中的 DDL 存在以下限制:
不能在单条
ALTER TABLE语句中完成多个操作。例如,不能在单个语句中添加多个列或索引,否则,可能会输出Unsupported multi schema change的错误。ALTER TABLE不支持少部分类型的变更。比如,TiDB 不支持从DECIMAL到DATE的变更。当遇到不支持的类型变更时,TiDB 将会报Unsupported modify column: type %d not match origin %d的错误。更多细节,请参考 ALTER TABLE。TiDB 中,
ALGORITHM={INSTANT,INPLACE,COPY}语法只作为一种指定,并不更改ALTER算法,详情参阅 ALTER TABLE。不支持添加或删除
CLUSTERED类型的主键。要了解关于CLUSTERED主键的详细信息,请参考聚簇索引。不支持指定不同类型的索引 (
HASH|BTREE|RTREE|FULLTEXT)。若指定了不同类型的索引,TiDB 会解析并忽略这些索引。分区表支持
HASH、RANGE和LIST分区类型。对于不支持的分区类型,TiDB 可能会报Warning: Unsupported partition type %s, treat as normal table错误,其中%s为不支持的具体分区类型。分区表还支持
ADD、DROP、TRUNCATE操作。其他分区操作会被忽略。TiDB 不支持以下分区表语法:PARTITION BY KEYSUBPARTITION{CHECK|TRUNCATE|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD|REORGANIZE|COALESCE} PARTITION
更多详情,请参考分区表文档。
ANALYZE TABLE
TiDB 中的信息统计与 MySQL 中的有所不同:TiDB 中的信息统计会完全重构表的统计数据,语句执行过程较长,但在 MySQL/InnoDB 中,它是一个轻量级语句,执行过程较短。
更多信息统计的差异请参阅 ANALYZE TABLE。
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。
详情参见 SELECT。
UPDATE 语句
详情参见 UPDATE。
视图
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 默认:
排序规则:
- TiDB 中
utf8mb4字符集默认:utf8mb4_bin。 - MySQL 5.7 中
utf8mb4字符集默认:utf8mb4_general_ci。 - MySQL 8.0 中
utf8mb4字符集默认:utf8mb4_0900_ai_ci。
- TiDB 中
foreign_key_checks:- TiDB 默认:
OFF,且仅支持设置该值为OFF。 - MySQL 5.7 默认:
ON。
- TiDB 默认:
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。
- TiDB 默认:
lower_case_table_names:- TiDB 默认:
2,且仅支持设置该值为2。 - MySQL 默认如下:
- Linux 系统中该值为
0 - Windows 系统中该值为
1 - macOS 系统中该值为
2
- Linux 系统中该值为
- TiDB 默认:
explicit_defaults_for_timestamp:- TiDB 默认:
ON,且仅支持设置该值为ON。 - MySQL 5.7 默认:
OFF。 - MySQL 8.0 默认:
ON。
- TiDB 默认:
日期时间处理的区别
时区
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 中标记为弃用的功能,包括:
边栏推荐
- Neon optimization 1: how to optimize software performance and reduce power consumption?
- 693. alternate bit binary number
- Formation and release of function stack frame
- 427-二叉树(617.合并二叉树、700.二叉搜索树中的搜索、98. 验证二叉搜索树、530.二叉搜索树的最小绝对差)
- openstack实例重启状态就会变成错误处理方法,容器搭建的openstack重启计算节点compute服务方法,开机提示Give root password for maintenance处理方法
- 力扣 179、最大数
- 【QT小点】QT下载链接
- NEON优化1:软件性能优化、降功耗怎么搞?
- Webrtc series - Nomination and ice of 7-ice supplement for network transmission_ Model
- Matlab quickly converts two-dimensional coordinates of images into longitude and latitude coordinates
猜你喜欢

How to check the frequency of memory and the number of memory slots in CPU-Z?

树莓派4B上运行opcua协议DEMO接入kubeedge

The restart status of the openstack instance will change to the error handling method. The openstack built by the container restarts the compute service method of the computing node and prompts the gi

多线程带来的的风险——线程安全

JVM类加载机制

JVM overall structure analysis

Nlp-d62-nlp competition d31 & question brushing D15

How win 10 opens the environment variables window

My opinion on test team construction

Assembly language - Wang Shuang Chapter 13 int instruction - Notes
随机推荐
Gaussian distribution, linear regression, logistic regression
软件测试年终总结报告模板
Assembly language - Wang Shuang Chapter 3 notes and experiments
Go log -uber open source library zap use
JVM类加载机制
Multithreading basic part part 1
IAR Systems全面支持芯驰科技9系列芯片
POI 替换docx中的文字和图片
Matlab quickly converts two-dimensional coordinates of images into longitude and latitude coordinates
JVM调优思路
Code is data
WebRTC系列-網絡傳輸之7-ICE補充之提名(nomination)與ICE_Model
693. alternate bit binary number
开门小例子学习十种用例图
Sqlsever 字段相乘后保留2位小数
Formation and release of function stack frame
JVM tuning ideas
Change the status to the corresponding text during MySQL query
[FPGA] design and implementation of frequency division and doubling based on FPGA
426-二叉树(513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树、654. 最大二叉树)