【TiDB 4.0 PCTA 学习笔记】- 2.4 Behavior Differences Between MySQL and TiDB(TiDB 与 MySQL 的差异)@2班+邱育珍

课程名称:2.4 Behavior Differences Between MySQL and TiDB(TiDB 与 MySQL 的差异)

学习时长:20min

课程收获:

TiDB 兼容性概览,TiDB 和 MySQL 在语法、功能和行为上的主要差异。

课程内容:

  1. 兼容性概览
  • 100%支持MySQL5.7 client/server协议、MySQL 5.7 常用的功能及语法。MySQL 5.7 生态中的系统工具(PHPMyAdmin、Navicat、MySQL Workbench、mysqldump、Mydumper/Myloader)、客户端等均适用于 TiDB。

  • 大部分语法兼容MySQL 5.7及以上版本

  • 但 TiDB 尚未支持一些 MySQL 功能,可能的原因如下:

    • 有更好的解决方案,例如 JSON 取代 XML 函数。
    • 目前对这些功能的需求度不高,例如存储流程和函数。
    • 一些功能在分布式系统上的实现难度较大。
      image
      image
      image
  1. 不支持的特性
    image
  • 存储过程与函数
  • 触发器
  • 事件
  • 自定义函数
  • 外键约束 #18209
  • 临时表 #1248
  • 全文/空间函数与索引 #1793
  • ascii / latin1 / binary / utf8 / utf8mb4 的字符集
  • SYS schema
  • MySQL 追踪优化器
  • XML 函数
  • X-Protocol #1109
  • Savepoints #6840
  • 列级权限 #9766
  • XA 语法(TiDB 内部使用两阶段提交,但并没有通过 SQL 接口公开)
  • CREATE TABLE tblName AS SELECT stmt 语法 #4754
  • CHECK TABLE 语法 #4673
  • CHECKSUM TABLE 语法 #1895
  • GET_LOCKRELEASE_LOCK 函数 #14994

TiDB与MySQL主要的不同特性
自增 ID(AUTO_INCREMENT)

  • TiDB 的自增列仅保证唯一,也能保证在单个 TiDB server 中自增,但不保证多个 TiDB server 中自增,不保证自动分配的值的连续性,建议不要将缺省值和自定义值混用,若混用可能会收 Duplicated Error 的错误信息。
  • TiDB 可通过 tidb_allow_remove_auto_inc 系统变量开启或者关闭允许移除列的 AUTO_INCREMENT 属性。删除列属性的语法是: alter table modifyalter table change
  • TiDB 不支持添加列的 AUTO_INCREMENT 属性,移除该属性后不可恢复。
    自增 ID 详情可参阅 AUTO_INCREMENT

不支持的特性和主键

不支持同一个表同时alter两个column、不支持有损数据的修改


** 隔离级别

Performance schema

TiDB 主要使用 Prometheus 和 Grafana 来存储及查询相关的性能监控指标,所以 Performance schema 部分表是空表。

查询计划

EXPLAIN / EXPLAIN FOR 输出格式、内容、权限设置与 MySQL 有比较大的差别,参见理解 TiDB 执行计划

内建函数

支持常用的 MySQL 内建函数,有部分函数并未支持。可通过执行 SHOW BUILTINS 语句查看可用的内建函数。参考 SQL 语法文档

DDL 的限制

TiDB 中,所有支持的 DDL 变更操作都是在线执行的。可能与 MySQL 不同的是,在 TiDB 中, ALGORITHM=INSTANTALGORITHM=INPLACE 这两种 MySQL DDL 算法可用于指定使用哪种算法来修改表。

与 MySQL 相比,TiDB 中的 DDL 存在以下限制:

  • 不能在单条 ALTER TABLE 语句中完成多个操作。例如,不能在单个语句中添加多个列或索引,否则,可能会输出 Unsupported multi schema change 的错误。
  • 不支持不同类型的索引 ( HASH|BTREE|RTREE|FULLTEXT )。若指定了不同类型的索引,TiDB 会解析并忽略这些索引。
  • 不支持添加/删除主键,除非开启了 alter-primary-key 配置项。
  • 不支持将字段类型修改为其超集,例如不支持从 INTEGER 修改为 VARCHAR ,或者从 TIMESTAMP 修改为 DATETIME ,否则可能输出的错误信息 Unsupported modify column: type %d not match origin %d
  • 更改/修改数据类型时,尚未支持“有损更改”,例如不支持从 BIGINT 更改为 INT。
  • 更改/修改十进制列时,不支持更改预置。
  • 更改/修改整数列时,不允许更改 UNSIGNED 属性。
  • 分区表支持 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 中,它是一个轻量级语句,执行过程较短。

更多信息统计的差异请参阅 ANALYZE TABLE

SELECT 的限制

  • 不支持 SELECT ... INTO @变量 语法。
  • 不支持 SELECT ... GROUP BY ... WITH ROLLUP 语法。

视图

TiDB 中的视图不可更新,不支持 UPDATEINSERTDELETE 等写入操作。

存储引擎

  • 仅在语法上兼容创建表时指定存储引擎,实际上 TiDB 会将元信息统一描述为 InnoDB 存储引擎。TiDB 支持类似 MySQL 的存储引擎抽象,但需要在系统启动时通过 --store 配置项来指定存储引擎。

SQL 模式

TiDB 支持大部分 SQL 模式。不支持的 SQL 模式如下:

  • 不支持兼容模式,例如: ORACLEPOSTGRESQL (TiDB 解析但会忽略这两个兼容模式),MySQL 5.7 已弃用兼容模式,MySQL 8.0 已移除兼容模式。
  • TiDB 的 ONLY_FULL_GROUP_BY 模式与 MySQL 5.7 相比有细微的语义差别
  • NO_DIR_IN_CREATENO_ENGINE_SUBSTITUTION 仅用于解决与 MySQL 的兼容性问题,并不适用于 TiDB。

默认设置

  • 字符集:
    • TiDB 默认: utf8mb4
    • MySQL 5.7 默认: latin1
    • MySQL 8.0 默认: utf8mb4

学习过程中参考的其他资料

同学你好,感谢参与 TiDB 4.0 课程的学习!

本篇笔记逻辑清晰、内容丰富,被评选为优质笔记,将额外获得 20 积分,并在 「TiDB 培训」分类下获得“置顶”权益,积分兑换规则将于近期开放,敬请关注!

期待您继续产出优质内容!

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。