暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

A B 表设计思路之续

IT界数据库架构师的漂泊人生 2020-12-14
885

前篇链接 设计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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论