MariaDB 10.2 支持窗口函数吗与 MySQL 8.0 语法兼容性对比?

文章导读
MariaDB 10.2.0 于 2018 年正式引入窗口函数支持,与 MySQL 8.0 在窗口函数和 CTE 语法上基本兼容,但两者在身份验证插件和存储引擎实现上存在关键差异。
📋 目录
  1. 原因分析
  2. 窗口函数语法对比
  3. 身份验证插件差异
  4. 存储引擎兼容性
  5. 注意事项
  6. 参考来源
A A

MariaDB 10.2 支持窗口函数吗与 MySQL 8.0 语法兼容性对比

核心结论:MariaDB 10.2.0 于 2018 年正式引入窗口函数支持,与 MySQL 8.0 在窗口函数和 CTE 语法上基本兼容,但两者在身份验证插件和存储引擎实现上存在关键差异。

原因分析

窗口函数已被添加到 ANSI/ISO 标准 SQL:2003 中,然后在 ANSI/ISO 标准 SQL:2008 中进行了扩展。开源社区对窗口功能的众多愿望和要求,促使 MariaDB 10.2.0 中终于引入了这一特性。MySQL 直到 8.0 版本(2018 年正式发布)才开始支持窗口函数,这比 MariaDB 10.2 稍晚。两者都赶上了主流数据库产品的技术趋势,如 MS SQL Server 与 Oracle。

在存储引擎方面,MariaDB 10.1 版本使用 Percona XtraDB 来代替 MySQL 的 InnoDB,但 MariaDB 从 10.2 版本开始,对基于 MySQL 5.7 的 InnoDB 进行了大幅度改进,因此与 Percona XtraDB 分道扬镳。这一变化直接影响了两个数据库在性能表现和兼容性上的差异。

窗口函数语法对比

MariaDB 10.2 包含的窗口函数包括:ROW_NUMBER、RANK、DENSE_RANK、PERCENT_RANK、CUME_DIST、NTILE、COUNT、SUM、AVG、BIT_OR、BIT_AND 和 BIT_XOR 等。窗口函数查询加入 OVER 关键字表征,随后指定用于计算的一组记录。默认情况下,用于计算的一组行("窗口")是整个数据集,可以使用 ORDER BY 子句进行排序,然后使用 PARTITION BY 子句将窗口缩小到数据集内的特定组。

MySQL 8.0 通过标准的 WITH 关键字添加了 CTE,这与 MariaDB 10.2 实现的方式大致相同。递归通用表表达式可以引用其自己的子查询,示例如下:

WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5) SELECT * FROM cte;

执行结果返回 1 到 5 的数字序号。

身份验证插件差异

MySQL 8.0 开始将 caching_sha2_password 作为默认的身份验证插件。如果升级了数据库至 8.0 版本,对应用程序 JDBC 驱动兼容性不友好,最快的方法需要将默认的 caching_sha2_password 改为之前的 mysql_native_password。具体操作:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

或者直接写死在 my.cnf,重启 mysqld 服务永久生效:

[mysqld]
default_authentication_plugin = mysql_native_password

MariaDB 10.4 身份验证插件仍为 mysql_native_password,没有发生改变。UnixSocket 认证插件允许用户通过本地 Unix 套接字文件连接到数据库时使用操作系统的凭证,这个功能是在 MariaDB 10.4.6 版本里添加的,目前也支持在 MySQL 8.0.18 版本中。

MariaDB 10.2 支持窗口函数吗与 MySQL 8.0 语法兼容性对比?

存储引擎兼容性

MariaDB 10.1(基于 MySQL 5.6 版本)在 MySQL 5.7 版本发布之前就已经实现了 InnoDB 存储引擎加密。MariaDB 10.2(基于 MySQL 5.7 版本)在 MySQL 8.0 GA 发行版之前就已经引入了持久性 auto_increment,即 MySQL 重启后,该值不再丢失。

经典测试案例:一张 InnoDB 表里面包含了 ID 自增主键,在向表中插入 17 条记录之后,删除第 15~17 条记录,然后重启 mysqld 服务进程,再向该表中插入一条记录。答案是在 MySQL 5.7 及更早版本中,该记录的 ID 是 15;在 MySQL 8.0 版本中,该记录的 ID 是 18。

注意事项

第一,虽然 MariaDB 和 MySQL 通过 MySQL 协议保持兼容性(MySQL 客户端可以连接到 MariaDB,反之亦然),但它们已经发展了自己的方式,成为具有独特功能和不同产品愿景的独立数据库。第二,如果做主从复制的话,因为 GTID 复制不兼容,MySQL 既可以做主也可以做从,但是 MariaDB 不能做 MySQL 的从库。第三,MySQL 5.7 之后支持 super read only 特性,限制特权用户在从库写操作,这一特性在迁移时需要注意。第四,TokuDB 不在 MariaDB 默认包里发布,如果需要使用,请下载 mariadb-plugin-tokudb。

参考来源

来源:21 世纪技术官 - MySQL 8 与 MariaDB:两者窗口函数和 CTE 的比较(2018 年 3 月 14 日收录)

来源:CSDN 技术社区 - MariaDB 10.2 重要新特性(2021 年 1 月 27 日)

来源:知乎 - MySQL 8.0 与 MariaDB 10.4,谁更易于填坑补锅(2026 年 4 月 5 日)

来源:博客园 - MySQL 运维进阶指南(2025 年 1 月 23 日)