
哈,没想到开篇还是想写写 MySQL, 这篇文章我先来谈谈为什么使用 MySQL 需要一份开发规范。
在飞信的第一个工作(2009 年)就是把 SQL Server 的数据迁移到 MySQL 中。当时也没有特别好的 CDC 工具,年轻无畏的我利用 Trigger 记录增量及对应的 Action,用程序先抽全量,然后应用增量,一直处理增量,直到源库停止业务写入。迁移程序轮询所有表,1 分钟内无数据变化时,迁移完成,再做业务切换。后来的一些数据同步工作,很多时候也是借助于 Trigger 完成的。
然而,这个 Trigger 在 MySQL 中当时有一个比较大的 Bug,下面是 bug 地址:
> https://bugs.mysql.com/bug.php?id=11472
简单来说,就是在外键的情况下,又使用 Trigger 可能出现数据不一致的问题。
当时还看到 Heikki 第一时间回复说会在后面修复,并且明确表示在 5.1 版本中修复。
我遇到这个问题是在 2009 年,我用的 MySQL-5.1.31 高级企业版(非常坑的一个版本)。
2007 年大佬回复还需要一些时间~~~,然后到今年看起来还没修复,以至于成为我内心一个古老的 Bug 之一。这个 Bug 已经让 MySQL 从业者开始过生日了。
...
到 2025 年,社区小伙居然发出灵魂质问:
时间过得飞快,这个 Bug 已经 20 岁+了。这可以理解为为什么很多 MySQL 开发规范里禁止使用外键了。
MySQL 其他趣事:
1. 你知道 MySQL 有两个相似的索引 MySQL 在 Order by 排序上有什么特点吗?
2. 你知道 MySQL Enum 有什么特点吗?
3. 你知道 NULL 在 MySQL 或是程序中能带来多少损失吗?
如果不了解的情况下,坚持前公司的开发规范就行了。
最后给大家看一个我前几天看到的 Case,一个客户的数据从 MySQL 到 Databend 中同步,表结构如下:
类似这样的一个表结构有什么问题吗?你还知道什么其他有趣的 MySQL 在开发中遇到的问题,可以在留言中交流一下。
最后放一份早期的 MySQL 开发规范可以参考一下:
https://github.com/zhishutech/mysql-sql-standard