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.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 日)