MySQL正在改变对外键约束及级联操作的管理方式。从MySQL 9.6开始,外键验证及级联操作不再由InnoDB存储引擎负责处理,而是由SQL层直接执行。这一变化将提升数据变更的跟踪能力、复制的准确性以及数据的一致性,从而使MySQL在数据捕获管道、混合数据库环境以及分析场景中变得更加可靠。

长期从事数据捕获与复制相关工作的MySQL开发者们一直面临一个重大限制:外键约束是由InnoDB存储引擎管理的,而级联操作也不会被记录到二进制日志中。Oracle的技术顾问Prabakaran Thirumalai指出:

传统上,MySQL是在存储引擎层执行外键约束及级联操作的……所有级联操作都是由InnoDB内部完成的……由于这些变化不会反映在SQL引擎或二进制日志中,因此下游系统(如数据捕获管道和分析平台)可能会忽略它们,从而导致数据不一致、分析结果不可靠或复制出现故障。

例如,当SQL层向InnoDB发出一条DELETE命令时,根据级联规则,InnoDB可能会自动删除子表中的相关记录。然而这些额外的删除操作目前完全在存储引擎内部完成,并不会被记录到二进制日志中;而二进制日志仅会记录对父表执行的原始DELETE操作,而不会包含子表所发生的变化。

MySQL外键

来源:Oracle博客

这一变更已在MySQL 9.6.0版本中得到实现。作为MySQL 9.x系列创新版之一,该版本于1月份正式发布。社区普遍担心这一变更可能会影响系统性能,但Thirumalai进一步说明:

通过对常见事务处理场景进行大量测试,我们发现基于SQL引擎的外键约束及级联操作与InnoDB存储引擎的处理方式几乎没有任何差异。执行外键检查及级联操作所消耗的资源基本保持不变,因此系统的吞吐量或延迟也没有出现任何下降。

Hacker News上的一篇热门帖子中,Index Hint公司的创始人兼首席工程师Evan Elias也表达了同样的观点。

我很高兴Oracle发布了关于这一问题的博客文章,因为否则的话,MySQL的官方文档中几乎完全没有涉及这些内容。MySQL 9.6的发布说明中根本没有任何关于外键相关变更的说明。作为一家专注于提供MySQL解决方案的独立软件供应商,我必须说,这种情况确实令人非常担忧。我听说Oracle的高层管理人员曾承诺会重新重视MySQL Community Edition的发展,但既然连最基本的文档更新都无法及时进行,我们还能把这些承诺当真吗?

这一变化发生在一个许多社区成员都在质疑Oracle对MySQL及其社区版的承诺的关键时刻。此时,人们正在通过社区会议来讨论MySQL的未来发展方向,同时也有新的开发分支项目正在开展中,这些项目旨在进一步提升MySQL的功能。在文章“MySQL 9.6:外键级联操作功能终于被添加到二进制日志中”中,ReadySet公司的资深软件工程师Marcelo Altmann这样评论道:

对于那些多年来一直受限于外键级联操作功能的MySQL用户来说,或者更糟糕的是,在下游系统中出现数据不一致问题后才意识到这一限制的存在,MySQL 9.6确实填补了一个重要的技术漏洞。现在,二进制日志终于能够完整记录数据变化的过程了。

Uber公司的资深软件工程师Banty Kumar也指出:

如果Oracle能够提供长期支持版本,那么这个理由确实足以促使用户升级MySQL到9.6版本。

根据官方公告,Oracle团队计划在未来为级联操作中的触发器功能以及更多存储引擎上的外键约束机制提供更全面的支持。目前,MySQL 9.6.0已经可以在MySQL的社区服务器下载页面上下载了。

Comments are closed.