首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL秒级加列终成现实#M1001

破产码农

IT圈最会讲故事的网红

记得2015年DTCC数据库大会时,盖总和我推杯换盏,大谈PostgreSQL未来在企业发展的可能性。当时可能雪碧喝高了,一口咬定:PG没有前途,不论OLTP还是OLAP领域。盖总报以迷之微笑。北京回来之后,当即发文:去IOE,MySQL完胜PostgreSQL。谁知一石激起千层浪,听闻这篇文章让一些公司的销售哥哥们辗转反侧,公司濒临破产,上市计划就此搁浅。公司创始人不惜发动水军对我进行各种攻击。

如果区区一家言论能让一家公司IPO失败,是不是那家公司应该考虑给我个1%的股份。这就好似那些开放商和房产大V互相狼狈为奸,蛊惑老百姓接盘商住公寓?还美其名曰地和小白说,做低房价可以避税。

2年后,我想盖总应该欠我一瓶82年的雪碧。毕竟恩墨没有all in PG,否则死的得多难看。盖总是不是连仅剩的一些头发都要没了?一世英名毁于一旦。当然,每个圈子都少不了笑话,比如最近看到最好笑的笑话:

连续三月涨势明显!PostgreSQL这是要赶超MySQL的节奏?

觉醒

对于任何一个关系型数据库来说,DDL操作都是非常令人头疼的问题。当你表的数据上亿后,DDL操作带来的酸爽感更是令DBA回味无穷。Facebook在6年前开源的OSC(Online Schema Change)率先解决了DDL过程中无法读写的问题。MySQL 5.6版本在内核层支持了Online DDL。从此加列、加索引都已不会阻塞业务的读写操作。

然而对于MySQL的复制来说,由于是基于ROW格式的逻辑复制。因此虽然DDL不会对业务产生直接影响,但是会对复制产生延迟,从而间接地影响业务。

对于在线加列操作来说,这简直是DBA的噩梦。OSC脚本并无法保证一定可以添加列完成。例如对一个超级大表添加列,磁盘空间不足;亦或者表设计的时候并没有唯一索引。对于MySQL Online DDL来说,有唯一索引也有失败的可能性。总之,一个真正见过世面的DBA应该了解这个痛楚。

Q:PG有没有这个问题?

A:当然没有啊,没人用的系统怎么吹都行呗。房产大V会告诉你商住公寓的N个优点,但是不会告诉你未来100*N个缺点。房产商只要去库存就可以了嘛?

Q:如果房产商是云服务公司或技术服务供应商,那么房产大V是谁?

A:DG。

悟道

解决在线加列这个问题,我这里归纳大抵可以有四种方法:

冗余字段大法;

主从乾坤大挪移;

Jim Gray的指引;

无为而治的独孤九剑;

冗余字段很好理解,即在建核心表的时候预留N多字段,而且还要考虑常用的不同类型字段。这方法粗暴好用,淘宝内部都这么干了好久。其实,只要预留的列没到瓶颈,应该是最好的方法。只是当业务迅速发展时,通常会考虑不足。此外,让没有经验的开发同学,预留足够的字段,也是件技术活。

主从乾坤大挪移是官方文档中推荐的一种方法。即加列时先在从机添加,然后再做主从计划内切换的操作。只要添加的新列是在表的最后,复制就不会收到影响。

乾坤大挪移大法虽好,但表需要重建,还是逃不过之前说的几个问题。而且主从复制延迟也会收到影响。另外,这还需要一套数据库自动化运维平台的保障,否则工作量也并不小。

《Transaction Processing》一书对大表在线加列问题有过阐述。记得没错的话,大神Jim Gray一句话就将方法告诉了你。即修改数据字典表,新列并不真正在物理上添加,只有更新时才做真正的加列填充数据操作。

腾讯互娱数据库团队是真正第一个在MySQL层解决这个问题的。记得2012年在DTCC和他们的开发人员一起涮肉吃火锅,聊到他们正在考虑做这样的功能,因为游戏在线加列的操作真的过于频繁。我也小小的给过关于Online DDL接口实现的相关意见。当最终在线加列功能在TMySQL实现时,个人觉得此功能足以震古烁今。毫无疑问,目前为止,国人开发过最为牛X的MySQL功能/Patch。

真正闪着金光的人是不会被历史埋没的。MariaDB 10.3合并了腾讯互娱数据库团队的Patch,听闻MySQL 8.0也即将合并此Patch。恭喜互娱团队,这样的成绩,足以吹一辈子牛。

Q:姜老师,你现在能吹最大的牛是啥?

A:上错飞机......

MySQL 5.7新增JSON数据类型,即关系型数据库支持文档的存储方式。若在每张表加一个JSON类型,当需要新增列时往JSON列中添加响应的field和value即可。同时,配合MySQL 5.7新增的函数索引,这种方式未来或许会成为在线添加列的一种新方法论。

有同学认为JSON就是之前的BLOB类型,然而并不是。JSON类型内部做了大量的优化工作。另外,JSON类型在数据存取效率上比BLOB高效的多。

这种方法的缺点在于,开发人员太过自由,想怎么存就怎么存。最终可能导致不好的表结构设计范式。总之,独孤九剑,遇强则强。

天罗

长期坚持原创真的很不容易,多次想放弃。坚持是一种信仰,专注是一种态度!点赞和转发是对作者最好的褒奖哟~~~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171221G0R9CG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券