内容提要
PlanetScale宣布支持外键约束,开发历时约一年,面临多层次挑战,包括与MySQL的限制、在线DDL和分支逻辑的兼容性。外键约束增加了部署请求的复杂性,要求特定的执行顺序,撤销操作可能导致孤立行。目前仅支持单分片数据库,未来计划扩展到多分片环境。
延伸解读
外键约束与在线DDL的兼容性挑战
文章详细阐述了外键约束与在线DDL的冲突。在线DDL通过创建影子表、复制数据、同步变更后交换表来实现非阻塞模式变更,但外键约束导致三个问题:无法跟踪带有级联操作(SET NULL或CASCADE)的子表的二进制日志;交换父表时子表的外键约束会跟随旧表;影子表自身的外键约束会影响父表操作。PlanetScale通过修改MySQL引入内部操作表等机制解决,但增加了复杂性。
分支与部署请求中的外键顺序依赖
在PlanetScale的分支模型中,部署请求需要计算从基分支到头部分支的迁移路径,并确保每一步都保持模式有效。外键约束引入了部署顺序的依赖:例如创建子表前必须存在父表,添加外键前父表必须有对应索引。某些变更可以并发执行,但有些必须串行,且如果分支变更过多导致单个表需要多步操作,部署请求可能无法部署。这些都在内存中通过schemadiff评估。
回滚操作可能产生孤立行
PlanetScale支持回滚部署,但外键约束使回滚复杂化。例如,删除子表后,父表数据可能被删除,此时回滚恢复子表会导致孤立行。类似地,任何约束的删除或修改后,数据可能已变得不兼容,回滚后无法保证约束一致性。PlanetScale允许此类回滚,但会警告模式虽可恢复,但可能出现孤立行,需要用户注意数据完整性风险。
当前仅支持单分片,未来扩展多分片
目前外键约束支持仅限于未分片或单分片数据库,查询只涉及单个后端MySQL服务器。对于多分片环境,PlanetScale计划支持分片范围内的外键甚至跨分片外键。由于MySQL的外键约束是服务器内部约束,无法跨服务器工作,PlanetScale选择在Vitess层实现外键逻辑,为未来多分片支持铺路,但这也带来了额外的锁和通信开销,对性能有非零影响。
Q&A
PlanetScale为什么花了一年时间来支持外键约束?
PlanetScale在支持外键约束的过程中面临多层次的挑战,包括与MySQL的限制、在线DDL和分支逻辑的兼容性等问题。
外键约束如何影响部署请求的复杂性?
外键约束要求特定的执行顺序,增加了部署请求的复杂性,撤销操作可能导致孤立行。
目前PlanetScale对外键约束的支持范围是什么?
目前仅支持单分片数据库,未来计划扩展到多分片环境。
外键约束的撤销操作可能导致什么问题?
撤销外键约束的操作可能导致孤立行,特别是在删除子表后再恢复时。
PlanetScale如何处理分支和部署请求中的外键约束?
PlanetScale在处理分支和部署请求时,需要评估分支之间的差异,并确保遵循外键约束的规则和执行顺序。
外键约束在在线DDL中面临哪些挑战?
外键约束在在线DDL中面临的问题包括无法与现有的MySQL外键约束实现兼容,特别是在处理级联操作时。