这才是真正的表扩展方案

简介: 事情变得有意思了,上一篇花1小时撰写的“一分钟”文章,又引起了广泛的讨论,说明相关的技术大家感兴趣,挺好。第一次一篇技术文章的评论量过100,才知道原来“评论精选”还有100上限,甚为欣慰(虽然是以一种自己不愿看到的方式)。

事情变得有意思了,上一篇花1小时撰写的“一分钟”文章,又引起了广泛的讨论,说明相关的技术大家感兴趣,挺好。第一次一篇技术文章的评论量过100,才知道原来“评论精选”还有100上限,甚为欣慰(虽然是以一种自己不愿看到的方式)。

《啥,又要为表增加一列属性?》的方案颇有争议:

(1)版本号version + 扩展字段ext

(2)用增加列的key+value方式扩充属性

有些评论,只能说“所谓夏虫,何以语冰”(作者要谦和,请删除)。因自己时间仓促,有些地方没有交代清楚,对不起大伙,实在抱歉。大部分评论还是在进行技术讨论,故今天再熬夜补充说明一下。

零、缘起

讨论问题域:

(1)数据量大、并发量高场景,在线数据库属性扩展

(2)数据库表结构扩展性设计

一、哪些方案一定是不行的

(1)alter table add column

要坚持这个方案的,也不多解释了,大数据高并发情况下,一定不可行

(2)通过增加表的方式扩展,通过外键join来查询

大数据高并发情况下,join性能较差,一定不可行

(3)通过增加表的方式扩展,通过视图来对外

一定不可行。大数据高并发情况下,互联网不怎么使用视图,至少58禁止使用视图

(4)必须遵循“第x范式”的方案

一定不可行。互联网的主要矛盾之一是吞吐量,为了保证吞吐量甚至可能牺牲一些事务性和一致性,通过反范式的方式来确保吞吐量的设计是很常见的,例如:冗余数据。互联网的主要矛盾之二是可用性,为了保证可用性,常见的技术方案也是数据冗余。在互联网数据库架构设计中,第x范式真的没有这么重要

(5)打产品经理

朋友,这是段子么,这一定不可行

二、哪些方案可行,但文章未提及

(1)提前预留一些reserved字段

这个是可以的。但如果预留过多,会造成空间浪费,预留过少,不一定达得到扩展效果。

(2)通过增加表的方式扩展列,上游通过service来屏蔽底层的细节

这个也是可以的。Jeff同学提到的UserExt(uid, newCol1, newCol2)就是这样的方案(但join连表和视图是不行的)

三、哪些读者没有仔细看文章

(1)version+ext太弱了,ext不支持索引

回复:属于没有仔细看文章,文章也提了如果有强需求索引可以使用MongoDB,它就是使用的json存储(评论中有不少朋友提到,还有其他数据库支持json检索)

(2)第二种key+value方案不支持索引

回复:uid可以索引

四、key+value方式使用场景

服务端,wordpress,EAV,配置,统计项等都经常使用这个方案。

客户端(APP或者PC),保存个人信息也经常使用这个方案。

今天的重点

以楼主性格,本不会进行“解释”,上文解释这般,说明这一次,楼主真的认真了。对于技术,认真是好事,认真的男人最可爱(打住,我要吐了)。好了,下面的内容才是今天的重点。

五、在线表结构变更

在《啥,又要为表增加一列属性?》文章的开头,已经说明常见“新表+触发器+迁移数据+rename”方案(pt-online-schema-change),这是业内非常成熟的扩展列的方案(以为大伙都熟悉,没有展开讲,只重点讲了两种新方案,这可能是导致被喷得厉害的源头),今天补充说一下。

以user(uid, name, passwd)

扩展到user(uid, name, passwd, age, sex)为例

基本原理是:

(1)先创建一个扩充字段后的新表user_new(uid, name, passwd, age, sex)

(2)在原表user上创建三个触发器,对原表user进行的所有insert/delete/update操作,都会对新表user_new进行相同的操作

(3)分批将原表user中的数据insert到新表user_new,直至数据迁移完成

(4)删掉触发器,把原表移走(默认是drop掉)

(5)把新表user_new重命名(rename)成原表user

扩充字段完成。

优点:整个过程不需要锁表,可以持续对外提供服务

操作过程中需要注意:

(1)变更过程中,最重要的是冲突的处理,一条原则,以触发器的新数据为准,这就要求被迁移的表必须有主键(这个要求基本都满足)

(2)变更过程中,写操作需要建立触发器,所以如果原表已经有很多触发器,方案就不行(互联网大数据高并发的在线业务,一般都禁止使用触发器)

(3)触发器的建立,会影响原表的性能,所以这个操作建议在流量低峰期进行

pt-online-schema-change是DBA必备的利器,比较成熟,在互联网公司使用广泛。

楼主非专业的dba,上面的过程有说的不对的地方,欢迎指出。要了解更详细的细节,可以百度一下。有更好的方法,也欢迎讨论,后续会梳理汇总share给更多的朋友。

六、结束

欢迎用批判的眼光看问题,欢迎任何友善的技术讨论,不太欢迎“纯属误导”“非常蠢的方案”这样的评论(但我还是会加精选,任何人都有发声的权利)。

借评论中@张九云 朋友的一句话“不要以为自己见过的就是全世界,任何方案都有使用场景,一切都是tradeoff”作为今天的结尾,谢谢大家的支持,感谢大家。

==【完】==

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
小程序
微信小程序获取数据的方法——iBeacon蓝牙
微信小程序获取数据的方法——iBeacon蓝牙
413 0
|
2月前
|
人工智能 定位技术 数据库
工具设计+动态检索:上下文工程如何让AI智能体像人类一样思考?
本文深入解析AI Agent时代的上下文工程,阐述其从提示工程的演进逻辑,剖析系统提示、工具设计与示例策划三大核心,并探讨长时程任务应对策略,揭示高效信息流管理对构建可靠Agent的关键作用。建议收藏细读。
367 0
|
Oracle 关系型数据库 数据库
Oracle 部署及基础使用,字节跳动资深面试官亲述
Oracle 部署及基础使用,字节跳动资深面试官亲述
|
机器学习/深度学习 监控 PyTorch
以pytorch的forward hook为例探究hook机制
【10月更文挑战第9天】PyTorch中的Hook机制允许在不修改模型代码的情况下,获取和修改模型中间层的信息,如输入和输出等,适用于模型可视化、特征提取及梯度计算。Forward Hook在前向传播后触发,可用于特征提取和模型监控。实现上,需定义接收模块、输入和输出参数的Hook函数,并将其注册到目标层。与Backward Hook相比,前者关注前向传播,后者侧重反向传播和梯度处理,两者共同增强了对模型内部运行情况的理解和控制。
470 3
|
运维 测试技术 Linux
关于Stress 压力测试工具的介绍与使用
在日益复杂的计算环境中,保证系统的稳定性和性能成为了每个Linux管理员的核心任务。面对不断增长的数据量和业务需求,如何有效评估系统极限和潜在瓶颈? 压力测试工具:stress,成为了不可或缺的助手。这篇记录描述stress工具的使用方法及其在模拟真实负载中的实用性。
关于Stress 压力测试工具的介绍与使用
|
存储 关系型数据库 MySQL
MySQL数据库进阶实战:解锁性能飙升秘籍,从菜鸟到高手的华丽蜕变,让数据操作如行云流水!
【8月更文挑战第5天】MySQL是最流行的开源关系型数据库之一,在Web开发与数据分析等领域广泛应用。本文通过实战代码示例,深入探讨MySQL进阶技能:包括索引优化以提升查询性能;利用JOIN与子查询处理多表关联数据;通过事务处理确保数据一致性;使用存储过程与函数封装复杂逻辑以便重用;设置触发器自动执行特定任务以维护数据完整性。掌握这些技能能显著提高数据处理效率与系统性能。
395 5
|
机器学习/深度学习 自然语言处理 数据挖掘
从理论到实践:详解GraphRAG框架下的多模态内容理解与生成
【10月更文挑战第10天】随着多媒体内容的爆炸性增长,如何有效地理解和生成跨模态的数据(如图像、文本和视频)变得越来越重要。近年来,图神经网络(GNNs)因其在处理非结构化数据方面的强大能力而受到广泛关注。在此背景下,Graph Retrieval-Augmented Generation (GraphRAG) 框架作为一种新的方法,通过结合图检索和生成模型来提升多模态内容的理解与生成效果。本文将深入探讨GraphRAG的基本原理、核心组件以及实际应用,并通过代码示例展示其在多媒体内容处理中的潜力。
1854 0
|
NoSQL 网络协议 Redis
Redis从入门到精通之Redis事件机制详解
Redis采用事件驱动机制来处理大量的网络IO,这是Redis实现高性能的关键之一。Redis并没有采用成熟的开源方案如libevent或libev,而是自己实现了一个非常简洁的事件驱动库ae_event。
1022 101
Redis从入门到精通之Redis事件机制详解
|
存储 搜索推荐 数据库
软件系统【标签tag功能】的两种数据库设计
软件系统中的标签功能可采用两种数据库设计。方案一,文章和Tag各一表,Tag信息存储在文章表内(`tags`和`tagids`字段),优点是模型简单,但查询效率低且易引发数据冗余和一致性问题。方案二,增加Tagmap表,用于存储标签-文章映射,利于索引查询和数据更新,适用于高效率需求,但结构更复杂。
859 0
软件系统【标签tag功能】的两种数据库设计
|
数据可视化 数据挖掘 数据处理
淘宝天猫玩具销售数据可视化(下)
淘宝天猫玩具销售数据可视化(下)
696 2