前篇链接 设计AB表
今天我跟朋友继续讨论AB表设计的应用场景, 从上面来说 就那么几个场景可以使用. DBA说可以用分区交换方式替代. 真的吗? A B表就这点生产空间吗?
非也 ! 因为2016年的灵感的激发,绝不是这些场景引起来的.
什么场景下使用AB表?
1 如上面的业务只读,数据由外部装入
2 跨年表 因为业务上新年一过就不处理去年的业务
3 日志写表 应用不断往一个表写入日志,该日志只是为了审计,不参与业务。日志表太大了,通过常规方式清理会影响日志写的程序。
难道不能应用在业务相关的表吗? 好像也可以哦,只有解决了读的问题,
比如说先读A表, 没数据,再去读B表. 这样就获得了数据,解决了业务数据不一致性问题. 只是要读两次!
很多7X24小时的业务系统, 互联网+的系统 基本上没有停机维护的机会.尤其是MYSQL 要给它增加字段,索引,哪怕是注解都要获取元数据锁 MDL。这样造成阻塞DML操作! 如果使用A B表就不会了,随时随刻都可以进行维护,在不处于服务状态的表进行添加个字段,添加索引,添加注解。不会阻塞写操作,读操作通过MVCC 去了。点击下切换按钮,更改路由表的 服务状态TABLE_FLAG='B'
SELECT TALBE_FLAG INTO L_FLAG
FROM ROUT_TABLE
WHERE TABLE_NAME='XXX'
## DML 判断 一次DML
IF L_FLAG='A' THEN
INSERT INTO TABLE_A VALUES('','');
ELSE
INSERT INTO TABLE_B VALUES('','');
END IF;
##读判断,读两次
IF L_FLAG='A' THEN
SELECT COUNT(1) L_EXITS FROM TABLE_A WHERE AGE=?;
IF L_EXITS > 0 THEN
SELECT NAME,AGE,MONEY FROM TABLE_A WHERE AGE=?;
ELSE L_EXITS = 0 THEN
SELECT NAME,AGE,MONEY FROM TABLE_B WHERE AGE=?;
END IF
IF L_FLAG='B' THEN
SELECT COUNT(1) L_EXITS FROM TABLE_B WHERE AGE=?;
IF L_EXITS > 0 THEN
SELECT NAME,AGE,MONEY FROM TABLE_B WHERE AGE=?;
ELSE L_EXITS = 0 THEN
SELECT NAME,AGE,MONEY FROM TABLE_A WHERE AGE=?;
END IF
复制
文章转载自IT界数据库架构师的漂泊人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
2544次阅读
2025-04-09 15:33:27
数据库国产化替代深化:DBA的机遇与挑战
代晓磊
1186次阅读
2025-04-27 16:53:22
2025年3月国产数据库中标情况一览:TDSQL大单622万、GaussDB大单581万……
通讯员
859次阅读
2025-04-10 15:35:48
2025年4月国产数据库中标情况一览:4个千万元级项目,GaussDB与OceanBase大放异彩!
通讯员
679次阅读
2025-04-30 15:24:06
数据库,没有关税却有壁垒
多明戈教你玩狼人杀
583次阅读
2025-04-11 09:38:42
天津市政府数据库框采结果公布,7家数据库产品入选!
通讯员
569次阅读
2025-04-10 12:32:35
国产数据库需要扩大场景覆盖面才能在竞争中更有优势
白鳝的洞穴
547次阅读
2025-04-14 09:40:20
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
487次阅读
2025-04-17 17:02:24
一页概览:Oracle GoldenGate
甲骨文云技术
464次阅读
2025-04-30 12:17:56
GoldenDB数据库v7.2焕新发布,助力全行业数据库平滑替代
GoldenDB分布式数据库
457次阅读
2025-04-30 12:17:50