60

MySQL 秒级加列终成现实

 6 years ago
source link: https://mp.weixin.qq.com/s/bwmu3X5ZsWewMMjqMDCC7A?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

MySQL秒级加列终成现实 #M1001#

Original 破产码农 破产码农 2017-12-21 11:00 Posted on

Image        

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高效的多。

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

IMG社区微信群已满,目前新增 IMG社区群-武当 微信群,原群改名为IMG社区群-少林。想不想和各路高手切磋技艺?赶快加入IMG微信群吧,首先扫描下方二维码,审核通过后方能入群哦。(PGer与猎头不得入内)

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK