从MySQL到TiDB:兼容性全解析

        MySQL 在高并发和大数据量场景下,单个实例的扩展性有限。而 TiDB 作为一款分布式NewSQL数据库,设计之初就支持水平扩展(Scale-Out),通过增加节点来线性提升处理能力和存储容量,能够很好地应对大规模数据和高并发读写需求。

        TiDB 对 MySQL 协议提供了高度兼容,应用程序可以几乎无感知地从 MySQL 迁移到 TiDB,同时许多现有的 MySQL 工具和框架也能直接应用于 TiDB。

        但是TiDB毕竟不等于 MySQL,还是有一些少许的差异,今天就带大家了解下 TIDB 与MySQL 的差异。

TiDB与MySQL兼容性对比

        TiDB 高度兼容 MySQL 5.7 协议、MySQL 5.7 常用的功能及语法。TiDB 尚未支持一些MySQL 功能,可能得原因如下:

  • 有更好的解决方案,例如 JSON 取代 XML。
  • 目前对这些功能需求度不高,例如存储流程和函数。
  • 一些功能在分布式系统上的实现难度较大。

        除此之外 TiDB 不支持 MySQL 复制协议,但提供了专用工具与 MySQL 复制数据:

  • 从 MySQL 复制:TiDB Data Migration(DM) 是将 MySQL/MariaDB 数据迁移到 TiDB 的工具,可用于增量数据复制。
  • 向 MySQL 复制:TiCDC 是一款通过拉取TiKV变更日志实现的TiDB增量数据同步工具。

        下面来看下 TiDB 与 MySQL 的详细差异。

        自增ID

        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 语句查看可用的内建函数。

        DDL限制

        TiDB中,所有支持的DDL变更操作都是在线执行的。与MySQL相比,TiDB中的DDL存在以下限制:

  • 使用 ALTER TABLE 修改一个表的多个模式对象(如列、索引)时,不允许在多个更改中指定一个模式对象。例如,ALTER TABLE t1 MODIFY COLUMN c1 INT, DROP COLUMN c1 在两个更改中都指定了 c1 列,执行该语句会输出 Unsupported operate same column/index 的错误。
  • 不支持使用单个 ALTER TABLE 语句同时修改多个TiDB特有的模式对象。
  • ALTER TABLE 不支持少部分类型的变更。比如,TiDB 不支持从 DECIMAL 到 DATE 的变更。当遇到不支持的类型变更时,TiDB 将会报 Unsupported modify column: type %d not match origin %d 的错误
  • 不支持指定不同类型的索引 (HASH|BTREE|RTREE|FULLTEXT)。若指定了不同类型的索引,TiDB 会解析并忽略这些索引。
  • 分区表支持HASH、RANGE 和 LIST 分区类型。对于不支持的分区类型,TiDB 可能会报 Warning: Unsupported partition type %s, treat as normal table 错误,其中 %s 为不支持的具体分区类型。

        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。

        字符集和排序规则

        字符集 (character set) 是符号与编码的集合。TiDB 中的默认字符集是 utf8mb4,与 MySQL 8.0 及更高版本中的默认字符集匹配。

        排序规则 (collation) 是在字符集中比较字符以及字符排序顺序的规则。例如,在二进制排序规则中,比较 A 和 a 的结果是不一样的:

​​​​​​​

        TiDB 默认使用二进制排序规则。这一点与 MySQL 不同,MySQL 默认使用不区分大小写的排序规则。

        存储引擎

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

日期时间处理的区别

        TiDB 与 MySQL 在日期时间处理上有如下差异:

  •  TiDB 采用系统当前安装的所有时区规则进行计算(一般为 tzdata 包),不需要导入时区表数据就能使用所有时区名称,导入时区表数据不会修改计算规则。
  • MySQL 默认使用本地时区,依赖于系统内置的当前的时区规则(例如什么时候开始夏令时等)进行计算;且在未导入时区表数据的情况下不能通过时区名称来指定时区。 

总结

        从MySQL迁移到TiDB主要是为了满足业务发展带来的海量数据处理、高并发访问、实时分析等需求,同时利用TiDB的分布式优势提高系统的稳定性和可扩展性,并维持较低的运维成本。在使用过程中能满足绝大多数的应用场景,但是要注意细微差异。

​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习——绪论总结

目录 一、引入 二、基本术语 三、假设空间与归纳偏 四、模型选择 一、引入 机器学习:通过计算手段,得出具有能够自我修改、完善能力的模型,利用经验改善系统自身性能。算法使用数据得到模型的过程即称为学习,或训练 流程&…

Framework - ActivityThread 应用启动UI渲染流程

一、概念 ActivityThread拥有 main(String[] agrs) 方法,作为程序的入口,是应用程序的初始化类。(ActivityThread不是主线程,它在 main() 方法中实例化,是运行在主线程中。)ApplicationThread是 ActivityT…

【Nginx】Ubuntu如何安装使用Nginx反向代理?

文章目录 使用Nginx反向代理2个web接口服务步骤 1:安装 Nginx步骤 2:启动 Nginx 服务步骤 3:配置 Nginx步骤 4:启用配置步骤 5:检查配置步骤 6:重启 Nginx步骤 7:访问网站 proxy_set_header 含义…

海外IP代理:解锁网络边界的实战利器

文章目录 引言:正文:一、Roxlabs全球IP代理服务概览特点:覆盖范围:住宅IP真实性:性价比:在网络数据采集中的重要性: 二、实战应用案例一:跨境电商竞品分析步骤介绍:代码示…

LeetCode--189

189. 轮转数组 提示 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…

Ingress

文章目录 环境准备什么是 Ingress认识 Ingress 资源Ingress 控制器(controller)Ingress 规则pathType 路径类型多重匹配Ingress 类TLS生成证书创建密钥 环境准备 下面的 yaml 文件内容,是使用 sts 创建两个 web 服务,并配置对应的 servcie。web 服务的首…

微信小程序(三十三)promise异步写法

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.promise异步与普通异步的写法区别 2.promise异步的优势 源码&#xff1a; index.wxml <view class"preview" bind:tap"onChoose"><image src"{{avatar}}" mode"…

网络时间协议NTP工作模式

单播服务器/客户端模式 单播服务器/客户端模式运行在同步子网中层数较高层上。这种模式下,需要预先知道服务器的IP地址。 客户端:运行在客户端模式的主机(简称客户端)定期向服务器端发送报文,报文中的Mode字段设置为3(客户端模式)。当客户端接收到应答报文时,客户端会…

Chapter One - The History of Computers

Chapter One - The History of Computers 第一章 - 计算机的历史 I. Reading Material I. 阅读材料 My friends, let’s embark on an enlightening journey through the captivating history of computers, unraveling the intricate threads that have woven the technolog…

DockerCompose+SpringBoot+Nginx+Mysql实践

DockerComposeSpringBootNginxMysql实践 1、Spring Boot案例 首先我们先准备一个 Spring Boot 使用 Mysql 的小场景&#xff0c;我们做这样一个示例&#xff0c;使用 Spring Boot 做一个 Web 应 用&#xff0c;提供一个按照 IP 地址统计访问次数的方法&#xff0c;每次请求时…

linux交叉编译方法——虚拟机编译,在树莓派平台上运行

一、 交叉编译是什么 交叉编译 是在一个平台上生成另一个平台上的可执行代码。 我们再windows上面编写C51代码&#xff0c;并编译成可执行代码&#xff0c;如xx.hex, 是在c51上面运行&#xff0c;不是在windows上面运行 我们在ubuntu上面编写树…

Kubernetes k8s

Kubernetes k8s 一个开源的容器编排引擎&#xff0c;用来对容器化应用进行自动化部署、 扩缩和管理。 从架构设计层面&#xff0c;k8s能很好的解决可用性&#xff0c;伸缩性&#xff1b;从部署运维层面&#xff0c;服务部署&#xff0c;服务监控&#xff0c;应用扩容和故障处…

springboot并mybatis入门启动

pom.xml,需要留意jdk的版本&#xff08;11&#xff09;和springboot版本要匹配&#xff08;2.7.4&#xff09;&#xff0c;然后还要注意mybatis启动l类的版本&#xff08;2.2.2&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xm…

MAX31865读取PT100/PT1000电阻值

1、芯片介绍 MAX31865是简单易用的热敏电阻至数字输出转换器,优化用于铂电阻温度检测器(RTD)。外部电阻设置RTD灵敏度,高精度Δ- Σ ADC将RTD电阻与基准电阻之比转换为数字输出。MAX31865输入具有高达45V的过压保护,提供可配置的RTD及电缆开路、短路条件检测。 2、芯片特点…

解决Docker打包Eureka注册中心,其他服务无法注册问题

​前言 本文主要是介绍利用docker打包Eureka注册中心&#xff0c;并且发布镜像到服务器&#xff0c;遇到的一个比较坑的问题。主要是服务镜像部署完毕之后&#xff0c;docker容器都能启动&#xff0c;并且也能访问&#xff0c;但是其他服务就是无法注册到注册中心。排除问题&a…

查看阿里云maven仓中某个库有哪些版本

起因 最近项目上有做视频业务&#xff0c;方案是使用阿里云的短视频服务&#xff0c;其中也有使用到阿里云的上传SDK&#xff0c;过程中有遇一个上传SDK的内部崩溃&#xff0c;崩溃栈如下&#xff1a; Back traces starts. java.lang.NullPointerException: Attempt to invok…

只用一台服务器部署上线(宝塔面板) 前后端+数据库

所需材料 工具&#xff1a;安装宝塔面板服务器至少一台、域名一个 前端&#xff1a;生成dist文件&#xff08;前端运行build命令&#xff09; 后端&#xff1a;生成jar包&#xff08;maven运行package命令&#xff09; 准备&#xff1a; 打开宝塔面板&#xff0c;点击进入软…

2、安全开发-Python-Socket编程端口探针域名爆破反弹Shell编码免杀

用途&#xff1a;个人学习笔记&#xff0c;欢迎指正&#xff01; 目录 主要内容&#xff1a; 一、端口扫描(未开防火墙情况) 1、Python关键代码: 2、完整代码&#xff1a;多线程配合Queue进行全端口扫描 二、子域名扫描 三、客户端&#xff0c;服务端Socket编程通信cmd命…

Nginx简单阐述及安装配置

目录 一.什么是Nginx 二.Nginx优缺点 1.优点 2.缺点 三.正向代理与反向代理 1.正向代理 2.反向代理 四.安装配置 1.添加Nginx官方yum源 2.使用yum安装Nginx 3.配置防火墙 4.启动后效果 一.什么是Nginx Nginx&#xff08;“engine x”&#xff09;是一个高性能的HTTP…

Linux Zip解压缩命令

Zip 用法 $ zip [-选项] [-b 路径] [-t 日期] [-n 后缀名] [压缩文件列表] [-xi 列表] 默认操作是添加或替换压缩文件列表中的压缩文件条目&#xff0c;压缩文件列表可以包括特殊名称 -&#xff0c;压缩标准输入数据 Zip 是一个创建和管理 zip 文件的压缩工具 Unzip 是一个用…