1.1 MariaDB概述

MariaDB是MySQL源代码的一个分支,主要由开源社区维护,它采用的是GPL授权。开发这个分支的原因之一是甲骨文公司收购了MySQL之后,可能会将MySQL闭源,因此开源社区采用分支的方式来规避潜在的风险。

MariaDB与MySQL的绝大多数功能都是兼容的,前端应用(比如PHP、Perl、Python、Java、Golang、.NET、MyODBC、Ruby)几乎感觉不到两者之间有什么不同之处。事实上,MariaDB并不只是MySQL的替代品,它更是MySQL技术的创新和改进。

在存储引擎方面,MariaDB 10.1版本使用Percona XtraDB(后文简称XtraDB)来代替MySQL的InnoDB, XtraDB是InnoDB存储引擎的增强版,它完全兼容InnoDB,创建一个InnoDB表时,MariaDB内部默认会将其转换成XtraDB。XtraDB可以更好地发挥最新的计算机硬件系统的性能,同时还包含一些适用于高性能环境的新特性。XtraDB存储引擎是完全向下兼容的,在MariaDB中,XtraDB存储引擎被标识为“ENGINE=InnoDB”,这一点与InnoDB是一样的,所以直接用XtraDB替换InnoDB并不会产生任何问题。相较于InnoDB, XtraDB具有更多的特性、参数指标和扩展功能。从实践的角度来看,在CPU多核的条件下,XtraDB能够更有效地使用内存,并且性能更高。MariaDB从5.1版本开始,就默认使用XtraDB存储引擎了。

但是,随着技术的更新,InnoDB又迎头赶上来了,MariaDB从10.2版本开始,对基于MySQL 5.7的InnoDB进行了大幅度的改进,而XtraDB 5.7这时只是针对写入密集型I/O的使用场景进行了改进,并且移植XtraDB是一项非常复杂的任务,会延迟版本的发布周期,因此MariaDB又与Percona XtraDB分道扬镳了。在MariaDB 10.3.7和更高的版本中,使用的是InnoDB,它的实现与MySQL中的InnoDB有很大的不同。在这些版本中,InnoDB不再与MySQL发行版本相关联。

MariaDB中的InnoDB存储引擎与MySQL中的存在如下差异。

1)MariaDB 10.1(基于MySQL 5.6版本)在MySQL 5.7版本发布之前就已经实现了InnoDB存储引擎加密。

2)MariaDB 10.2(基于MySQL 5.7版本)在MySQL 8.0 GA发行版之前就已经引入了持久性auto_increment,即MySQL重启后,该值不再丢失。

例如,有这样一道经典面试题:一张InnoDB表里面包含了ID自增主键,在向表中插入17条记录之后,删除第15~17条记录,然后重启mysqld服务进程,再向该表中插入一条记录,这条记录的ID是18还是15?

答案是在MySQL 5.7及更早版本中,该记录的ID是15。在MySQL 8.0版本中,该记录的ID是18。原因是在MySQL 5.7及更早版本中,自增值计数器仅存储在内存中,而不是磁盘上,而MySQL 8.0版本修复了auto_increment值重启后丢失的问题。每当auto_increment的值发生更改时,当前自增值计数器的最大值都会写入重做(redo)日志,并保存到每个检查点的引擎专用系统表中。这种变更使得auto_increment当前的最大值能在重启时保持不变。这很容易成为业务陷阱,因为某些业务依赖自增ID来生成唯一值,在删除一些记录并重启MySQL后,新生成的ID可能会与之前的ID重复,从而导致ID冲突,插入失败。因此我们要慎重对待任何依赖于auto_increment值的业务逻辑,要充分了解auto_increment的实现方式,避免“踩坑”。

3)MariaDB 10.3(基于MySQL 5.7版本)在MySQL 8.0 GA发行版之前就已经引入了“INSTANT ADD COLUMN”(即时加字段)算法。

这意味着在很多情况下,卸载MySQL后若安装了MariaDB,那么通过mysql_upgrade命令即可完成升级。