当前位置: 首页 > 科技观察

几千万条记录,数据库表结构如何平滑更改?

时间:2023-03-14 21:05:03 科技观察

继续回答知识星球水友的问题。问题域:在数据量大、高并发的场景下,如何在流量低峰期顺利实现表结构变更?画外音,一般来说是指增加表属性,因为:如果列减少了,升级程序就用不到了;如果修改列,程序兼容性容易出现问题;首先,让我们看一下常见的解决方案。(1)方案一:在线修改表结构。画外音:altertableaddcolumn数据量大时,表锁时间会变长,导致拒绝服务,一般情况下是不可行的。(2)方案二:通过加表扩展属性,通过外键连接查询。比如t_user(uid,c1,c2,c3)想扩展属性,可以通过加表来实现:t_user_ex(uid,c4,c5,c6)在数据量大的情况下,join性能较差,一般不可行。(3)第三种方案是通过加表的方式进行扩展,通过视图来屏蔽底层的复杂性。如上所述,视图效率较低,一般不会使用。画外音:至少58到家禁止使用查看。(4)方案4,打产品经理,不让她修改需求。...(5)方案五,提前预留一些预留字段,并添加列以复用这些字段。这个方案是可行的,但是如果预留的太多,就会浪费空间。(6)方案六、pt-online-schema-change对于MySQL来说,这是一个比较成熟的方案,很多公司都在使用。画外音:我工作过的互联网公司,数据库都是用MySQL的。下面仍然以用户表扩展为例,介绍该工具的内部原理和步骤。假设:user(uid,name,passwd)被扩展为:user(uid,name,passwd,age,sex)第一步是创建一个新表,扩展字段:user_new(uid,name,passwd,age,性)画外音:是展开的表。第二步,在原表user上创建三个触发器,所有对原表user的insert/delete/update操作都会对新表user_new执行相同的操作;第三步,将原表user批量插入数据到新表user_new中,直到数据迁移完成;第四步,删除触发器,并移除原表(默认为drop);第五步,重命名(rename)新表user_new为原表user;扩展字段完成,整个过程不需要锁表,可以继续对外提供服务。操作中要注意:变更过程中,最重要的是处理好冲突。一个原则是以触发器的新数据为准,这就要求迁移的表必须有主键(基本满足这个要求);变更过程中,写操作需要创建触发器,所以如果原表已经有很多触发器,解决方案就不行了(互联网大数据、高并发的在线服务一般禁止使用触发器);触发器的建立会影响原来的表。性能,所以这个操作必须在流量的低峰期进行;pt-online-schema-change是DBA必备的工具。相对成熟,广泛应用于互联网公司。要了解更多详细信息,您还可以谷歌它。任何倒闭的架构设计都是耍流氓。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文