目前,MySQL 主要分支有 Oracle、Percona 和 MariaDB。三者各有特色:

  • MySQL 的官方版本由 Oracle 研发与维护,分为开源的社区版和收费的企业版
  • Percona 紧随 MySQL 社区版,并开发了很多 MySQL 相关的运维工具
  • MariaDB 相对来说更开放,功能点和特性也会多一些

mysql-brach

Oracle MySQL

MySQL 数据库最初由芬兰人 Monty Widenius 开发,它的发展历程其实并不平稳:

  • 1995 年,MySQL AB 公司成立,第一个内部版本发布,基于 ISAM。
  • 1998 年,MySQL 的 Windows 版本发布。
  • 2000 年,MySQL 基于 GPL 协议开源。
  • 2001 年,MySQL 3.23 版本发布:
    • MyISAM 代替了 ISAM
    • 全文索引
    • 复制
    • 支持多操作系统(特别是 Linux 下的 LAMP 组合,在互联网行业形成统治地位)
  • 2003 年,MySQL 4.0 版本发布:
    • 集成了 Innobase Oy 公司的 InnoDB 引擎
  • 2004 年,MySQL 4.1 版本发布:
    • 支持 utf8 字符集
    • 子查询
    • 预处理语句
  • 2005 年,MySQL 5.0 版本发布:
    • 游标
    • 存储过程
    • 触发器
    • 视图
    • XA事务
  • 2008 年,Sun Microsystems 收购 MySQL AB, MySQL 5.1 版本发布:
    • 定时器
    • 分区
    • 基于行的复制
    • plugin API
  • 2010 年,Oracle 收购 Sun,MySQL 5.5 版本发布:
    • InnoDB 成为默认的存储引擎
    • 多核扩展,能更充分地使用多核CPU
    • 支持索引的快速创建
    • 表压缩
    • Purge 操作从主线程中剥离出来
    • Buffer Pool 可拆分为多个 Instances
    • 半同步复制
    • utf8mb4 字符集
    • Metadata Lock
    • 可配置读、写线程的数量
    • 引入 innodb_io_capacity 选项
    • MySQL 企业版引入线程池
  • 2013年,MySQL 5.6 版本发布:
    • GTID
    • 延迟复制
    • 基于库级别的并行复制
    • mysqlbinlog 可远程备份 binlog
    • 时间类型支持微秒
    • Online DDL,ALTER操作不再阻塞DML
    • 可传输表空间(transportable tablespaces)
    • 全文索引
    • EXPLAIN 可用来分析 DML 操作
    • 提升 Redo 的总大小至 512G
    • 独立 Undo 表空间
    • 可对 Buffer Pool 进行 dump 和 load
    • 可设置多个purge线程
    • 优化器性能提升,引入了 ICP、MRR、BKA 等特性
  • 2015年,MySQL 5.7 版本发布:
    • 组复制
    • 多源复制
    • 增强半同步
    • 基于 WRITESET 的并行复制
    • 支持 GTID 复制与传统复制的在线切换
    • 在线设置复制过滤规则
    • 在线修改 Buffer Pool
    • 透明页压缩(Transparent Page Compression)
    • Undo 表空间自动回收
    • 查询优化器的重构和增强
    • 可查看当前正在执行的 SQL 的执行计划
    • 引入了查询改写插件(Query Rewrite Plugin)
    • JSON 格式的执行计划
    • 虚拟列
    • 新实例不再默认创建 test 数据库及匿名用户
    • 新增 ALTER USER 语法
    • 表空间加密
    • 减少了 performance schema 的内存占用
    • 原生支持分区表
    • 集成了 sys 数据库,简化了 MySQL 的管理及异常问题的定位
    • 原生支持 JSON 类型,并引入了众多 JSON 函数
    • 新的逻辑备份工具 mysqlpump,支持表级别的多线程备份
    • 废弃使用 mysql_install_db 进行实例的初始化
    • 原生支持 systemd
    • 引入了 super_read_only 选项
    • 可设置 SELECT 操作的超时时长(max_execution_time)
    • 可通过 SHUTDOWN 命令关闭 MySQL 实例
    • 引入了 innodb_deadlock_detect 选项,高并发场景下,可使用该选项来关闭死锁检测
    • 引入了 Optimizer Hints,可在语句级别控制优化器的行为
    • GIS 增强

从最新的 MySQL 5.7 版本来看,在 Oracle 的研发下,MySQL 的性能和特性都有了质的飞跃,完全不是老版本和其他开源关系型数据库所能比的。

题外话:
芬兰人为开源软件做了极大的贡献,除了 Monty,还有 Linux 操作系统创始人 Linus Torvalds,InnoDB 存储引擎创始人 Heikki Tuuri。

新增 MySQL 8.0 特性

  • 2018年,MySQL 8.0 版本发布:
    • 原生的基于 InnoDB 的数据字典
    • Atomic DDL
    • 重构了INFORMATION_SCHEMA,部分表已重构为基于数据字典的视图
    • PERFORMANCE_SCHEMA 查询性能提升,已内置多个索引
    • 不可见索引(Invisible index)
    • 降序索引
    • 性能直方图
    • 公用表表达式(Common table expressions)
    • 窗口函数(Window functions)
    • 角色(Role)
    • 资源组(Resource Groups)
    • 引入了 innodb_dedicated_server 选项
    • 快速加列
    • JSON 字段的部分更新(JSON Partial Updates)
    • 自增主键的持久化
    • 可持久化全局变量(SET PERSIST)
    • 默认字符集为 utf8mb4
    • 默认开启独立 Undo 表空间,支持在线调整数量
    • 备份锁
    • 可动态修改 innodb_log_buffer_size
    • 默认的认证插件由 mysql_native_password 更改为 caching_sha2_password
    • 默认的内存临时表由 MEMORY 引擎更改为 TempTable 引擎
    • Grant不再隐式创建用户
    • SELECT … FOR SHARE 和 SELECT … FOR UPDATE 语句引入 NOWAIT 和 SKIP LOCKED 选项,解决电商场景热点行问题
    • 新增了 4 个正则表达式函数:REGEXP_INSTR(),REGEXP_LIKE(),REGEXP_REPLACE(),REGEXP_SUBSTR()
    • 查询优化器在制定执行计划时,会考虑数据是否在 Buffer Pool 中
    • 引入了更多细粒度的权限来替代 SUPER 权限
    • GROUP BY 不再隐式排序
    • 可对 Redo 和 Undo 进行表空间加密
    • 支持直接修改列名(ALTER TABLE … RENAME COLUMN old_name TO new_name)
    • 用户密码可设置重试策略(Reuse Policy)
    • 移除 PASSWORD() 函数
    • 移除 Query Cache 模块
    • BLOB、TEXT、GEOMETRY 和 JSON 字段允许设置默认值
    • 可通过 RESTART 命令重启 MySQL 实例

Percona Server

Percona 是一家由前 MySQL 性能团队成员创立,通过提供 MySQL 技术服务进行盈利的公司。该公司基于 MySQL 官方版本发布了自己的分支,主打 “性能” 牌。但他们官网上的测试报告,其实是存在一定倾向性的,很多优化并不通用,我们在实际使用过程中也感受不到这些差别。当然,有些改进或者特性还是很不错的。从 5.6 版本开始,MySQL 将 Percona 所做的真正有用的改动全部集成了进来,随着版本的向前推进,Percona 的优势也越来越小。

值得一提的是,Percona 公司贡献了很多的重要的数据库组件和解决方案:

  • xtrabackup,一款 InnoDB 数据库的在线热备工具,不影响数据读写
  • percona-toolkit,一组高级命令行工具集,用来管理 MySQL 及系统任务
  • XtraDB Cluster,一套支持多点写入、数据实时同步的高可用集群架构
  • TokuDB,一种支持事务、高压缩比、高插入性能的存储引擎

MariaDB Server

Monty 离开 MySQL 项目之后, 出于对 Oracle 是否会持续支持 MySQL 社区版的担忧以及在开发理念方面的分歧, 他在 2009 年创建了 MariaDB 分支版本,并成立了基金会 。由于 Monty 的自身属性,他对于源码的改动或者调优的能力,是要比 Percona 来得强大得多的。也正因为这样,MariaDB 分支的改动越来越大,未来它与 MySQL 很有可能互不兼容。

对于 MariaDB 来说,有一个非常大的问题:它没有自己的核心存储引擎。大家用 MySQL 数据库,就是在用 InnoDB 存储引擎,而这个存储引擎和其开发团队都属于 Oracle。MariaDB 团队基本上是没有能力对 InnoDB 进行修改的,他们可能对复制和优化器的调整会比较有优势。但这两块如果让 Oracle 来做,也不会比其他人差,毕竟这是世界上最懂数据库的公司,没有之一。

如何选择

纵观全局,Oracle 已经占据了传统企业与互联网企业的两大市场,处于“天下无敌”的状态。所以,对于 MySQL 闭源这件事,Oracle 怎么也不会走出这种自断前程的路来。

MySQL 已经是国内互联网公司的标配了,架构、解决方案、人才储备非常完善。传统企业也迅速意识到了互联网的重要性,开始互联网化,MySQL 自然也就成了首选。国内的云服务厂商无一例外的都提供 MySQL 数据库产品,并将其作为核心服务。

综上所述,如何选择就显而易见了。