MySQL 在高并发和大数据量场景下,单个实例的扩展性有限。而 TiDB 作为一款分布式NewSQL数据库,设计之初就支持水平扩展(Scale-Out),通过增加节点来线性提升处理能力和存储容量,能够很好地应对大规模数据和高并发读写需求。
TiDB 对 MySQL 协议提供了高度兼容,应用程序可以几乎无感知地从 MySQL 迁移到 TiDB,同时许多现有的 MySQL 工具和框架也能直接应用于 TiDB。
但是TiDB毕竟不等于 MySQL,还是有一些少许的差异,今天就带大家了解下 TIDB 与MySQL 的差异。
TiDB 高度兼容 MySQL 5.7 协议、MySQL 5.7 常用的功能及语法。TiDB 尚未支持一些MySQL 功能,可能得原因如下:
除此之外 TiDB 不支持 MySQL 复制协议,但提供了专用工具与 MySQL 复制数据:
下面来看下 TiDB 与 MySQL 的详细差异。
TiDB 的自增列既能保证唯一,也能保证在单个 TiDB server 中自增,只用AUTO_INCREMENT MySQL 兼容模式能保证多个 TiDB server 中自增 ID,但不保证自动分配的值的连续性。
TiDB 可通过 tidb_allow_remove_auto_inc 系统变量开启或者关闭允许移除列的 AUTO_INCREMENT 属性。删除列属性的语法是:ALTER TABLE MODIFY 或 ALTER TABLE CHANGE。
TiDB 不支持添加列的 AUTO_INCREMENT 属性,移除该属性后不可恢复。
若创建表时没有指定主键时,TiDB会使用 _tidb_rowid 来标识行,该数值的分配和自增列(如果存在的话)公用一个分配器。如果指定了自增列为主键,则TiDB会用该列来标识行。
使用 AUTO_INCREMENT 可能会给生产环境带来热点问题,因此推荐使用AUTO_RANDOM代替。
TiDB中,执行计划(EXPLAIN 和 EXPLAIN FOR),在输出格式、内容、权限设置方面与MySQL有较大差异。
使用 EXPLAIN
可查看 TiDB 执行某条语句时选用的执行计划。也就是说,TiDB 在考虑上数百或数千种可能的执行计划后,最终认定该执行计划消耗的资源最少、执行的速度最快。
CREATE TABLE t (
id INT NOT NULL PRIMARY KEY auto_increment,
a INT NOT NULL, pad1 VARCHAR(255), INDEX(a)
);
INSERT INTO t VALUES (1, 1, 'aaa'),(2,2, 'bbb');
EXPLAIN SELECT * FROM t WHERE a = 1;
返回结果如下:
Query OK, 0 rows affected (0.96 sec)
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
+-------------------------------+---------+-----------+---------------------+---------------------------------------------+
| id | estRows | task | access object | operator info |
+-------------------------------+---------+-----------+---------------------+---------------------------------------------+
| IndexLookUp_10 | 10.00 | root | | |
| ├─IndexRangeScan_8(Build) | 10.00 | cop[tikv] | table:t, index:a(a) | range:[1,1], keep order:false, stats:pseudo |
| └─TableRowIDScan_9(Probe) | 10.00 | cop[tikv] | table:t | keep order:false, stats:pseudo |
+-------------------------------+---------+-----------+---------------------+---------------------------------------------+
3 rows in set (0.00 sec)
EXPLAIN
实际不会执行查询。EXPLAIN
ANALYZE
可用于实际执行查询并显示执行计划。如果 TiDB 所选的执行计划非最优,可用 EXPLAIN
或 EXPLAIN ANALYZE
来进行诊断。
支持MySQL常见的内建函数,有部分函数并未支持。可通过执行 SHOW BUILTINS 语句查看可用的内建函数。
TiDB中,所有支持的DDL变更操作都是在线执行的。与MySQL相比,TiDB中的DDL存在以下限制:
字符集 (character set) 是符号与编码的集合。TiDB 中的默认字符集是 utf8mb4,与 MySQL 8.0 及更高版本中的默认字符集匹配。
排序规则 (collation) 是在字符集中比较字符以及字符排序顺序的规则。例如,在二进制排序规则中,比较 A
和 a
的结果是不一样的:
TiDB 默认使用二进制排序规则。这一点与 MySQL 不同,MySQL 默认使用不区分大小写的排序规则。
仅在语法上兼容创建表时指定存储引擎,实际上 TiDB 会将元信息统一描述为 InnoDB 存储引擎。TiDB 支持类似 MySQL 的存储引擎抽象,但需要在系统启动时通过--store 配置项来指定存储引擎。
TiDB 与 MySQL 在日期时间处理上有如下差异:
tzdata
包),不需要导入时区表数据就能使用所有时区名称,导入时区表数据不会修改计算规则。从MySQL迁移到TiDB主要是为了满足业务发展带来的海量数据处理、高并发访问、实时分析等需求,同时利用TiDB的分布式优势提高系统的稳定性和可扩展性,并维持较低的运维成本。在使用过程中能满足绝大多数的应用场景,但是要注意细微差异。