AB表设计
以前在一家第三方结算的公司做运维DBA,在一次与开发人员探讨某个表的数据运维。那时我头脑想到AB表来切换使用,比如当A表写满后,就切到B表,那么A表就可以做运维工作。看到系统有管理,业务,日志WEB页面,我想应该有个数据运维页面,在页面上点击个按钮就改变应用程序从读A到读B的操作。当然没实现,比较在一个成型的系统不好做。去年面试个小额贷款公司,就被问到跨年问题,该表如何设计跨年。。。当时脑比较混沌没有回答好。出来后问了下朋友,朋友说采用RENAME方式。后来现在这公司,参加一次开发主导的头脑风暴,主要是评审。六张表每天都要装在数据,装完后由人工智能程序去分析,分析后写到结果表中。六张表每天都要清空再装新数据!为了不影响业务所以采用AB表方式。我当时感觉鸡冻,居然我的以前的想法现在有人去实现了。可惜接下来深度了解中后,有些遗憾!虽然采用了AB表,却采用RENAME去实现!
审核对方的SHELL脚本,基本流程是 清空表,删除索引,加载数据,创建索引,收集统计信息,把A表改名到C表,把装好数据的B表改名为A表,然后在对索引改名,最后把C表给删除。改表之前 SET LOCK_DDL_TIMEOUT=30,LOCK TABLE。。。
为了获得改名成功,设置了试图加DDL锁的等待时间,然后加表的独占锁,才开始改名。陪开发人员测试脚本,主要测试逻辑,还有注意事项,折腾了1个星期,从原来1个脚本变成了12个脚本。
本来我设想的AB表 额外加个路由表。当B表准备好了,就是数据装好了,索引重建了,信息收集完了.就去路由表更改标志位。 这样应用程序通过标志位获得当前该读取那张表。类似如下代码

SELECT TALBE_FLAG  INTO L_FLAG
FROM ROUT_TABLE
WHERE TABLE_NAME='XXX'IF L_FLAG='A' THENEXECUTE IMMEIDATE 'SELECT * FROM XXX_A';
ELSE EXECUTE IMMEIDATE 'SELECT * FROM XXX_B';
END IF;

好处:
1 是不用删除C表 空间浪费
2 是不用REMANE 这样的DDL锁 带来的风险
3 不用更改索引名字

这样的脚本就比较单纯,就
1 清空装数的目标表;
2 删除索引;
3 装在数据;
4 重建索引;
5 收集统计信息;
6 更改路由表;

什么场景下使用AB表?
1 如上面的业务只读,数据由外部装入
2 跨年表 因为业务上新年一过就不处理去年的业务
3 日志写表 应用不断往一个表写入日志,该日志只是为了审计,不参与业务。日志表太大了,通过常规方式清理会影响日志写的程序。

总之那种与业务关联不强,也与其他表关联不强的表数据可以通过AB表+路由表方式进行数据维护。也可是说是数据优化!

如今互联网应用都很多了,尤其那种不可申请停机,也没有业务上停机维护时间窗口,也没有高峰和低谷时间,平时每分钟交易频繁,产生大量数据,没有下手做维护的机会。那么AB表设计就是一个不错的选项!!
关注微信公众号:https://mp.weixin.qq.com/s/xZycdqNelKzowcCnC5e73g

前篇链接 设计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' THENINSERT 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 THENSELECT NAME,AGE,MONEY FROM TABLE_A WHERE AGE=?;ELSE L_EXITS = 0 THENSELECT NAME,AGE,MONEY FROM TABLE_B WHERE AGE=?;
END IFIF L_FLAG='B' THEN SELECT COUNT(1) L_EXITS FROM TABLE_B WHERE AGE=?;IF L_EXITS > 0 THENSELECT NAME,AGE,MONEY FROM TABLE_B WHERE AGE=?;ELSE L_EXITS = 0 THENSELECT NAME,AGE,MONEY FROM TABLE_A WHERE AGE=?;
END IF

A B 表的设计思路相关推荐

  1. 实现动态表单功能设计思路

    实现动态表单功能设计思路 文章目录 **实现动态表单功能设计思路** 一.业务场景 二.设计思路 三.数据库设计 四.页面展示 操作流程 部分代码 一.业务场景 业务只涉及简单的增删改查,但是业务类型 ...

  2. mysql 用户签到表设计_用户签到表的设计思路与数据库实现

    签到做为,一个促进用户粘性的手段已经很成熟了. 这里说下,个人的一些设计表思路 添加用户配置表.主键关联User表,即可. CREATE TABLE `cft_user_signin` ( `id` ...

  3. 碎片数据收集利器-结构化动态表单设计思路

    本文基于面向基本公共卫生的业务系统设计经验,抽象出一套适合大型ERP系统的表单业务数据模型,目标是最大限度保留系统弹性的同时,尽可能降低系统复杂度和开发成本.enjoy~ 背景 填写表单应该是所有业务 ...

  4. 旅游项目之数据库表的设计

    一.数据库表的设计思路 1.从业务出发 不应该针对整个系统进行数据库表的设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计:不同组件间对应的数据库表之间的关联尽可能 ...

  5. 用MongoDB数据库来管理办公系统中文档型的表单和信息——通用流程化应用审批单设计思路(二,续)

    1.办公系统中文档的定义 办公系统中的文档就是指对数据不敏感的业务,例如流程中的审批单.信息专栏.数据上报.信息记录等.而对于这些信息的管理,特别是时效性较强的管理记录,仍采用关系型数据库进行管理. ...

  6. 在BPM动态可配置表单中使用NoSQL技术可行性分析——通用流程化应用审批单设计思路(二)

    原业务流程平台审批单使用横向表纵向存储的思路,所有流程所使用的业务表单的数据都存在一张物理表中,表中每条数据记录包含Column定义和Value,Column所对应的字段信息,通过定义表来定义.这种做 ...

  7. 亿级流量网关设计思路

    本文准备围绕七个点来讲网关,分别是网关的基本概念.网关设计思路.网关设计重点.流量网关.业务网关.常见网关对比,对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分. 什么是网关 网关,很多地方将网关 ...

  8. 对RESTful Web API的理解与设计思路

    距离上一篇关于Web API的文章(如何实现RESTful Web API的身份验证)有好些时间了,在那篇文章中提到的方法是非常简单而有效的,我在实际的项目中就这么用了,代码经过一段时间的磨合,已经很 ...

  9. RBAC模型:设计思路

    RBAC模型 什么是RBAC RBAC(全称:Role-Based Access Control)基于角色的权限访问控制,作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在RBAC ...

最新文章

  1. matlab 灰色预测(有点离谱)
  2. Windows 中的环境变量 Path 与 XXXX_HOME 的区别
  3. (接口)银联证书上传被修改的问题和读取证书的绝对路径问题
  4. 限制对web路径的访问
  5. JDBC学习笔记(1)
  6. Mysql-5.5.3 主从同步不支持master-host问题的解决办法
  7. 几个互联网巨头的社区团购还不收手?
  8. 机器视觉对印刷业的影响
  9. AD画电路的踩坑点——继电器线圈的正负性以G6K-2F-Y为例
  10. mysql 当前时间的一周后_mysql查询当前时间,一天内,一周,一个月内的sql语句...
  11. 艾肯MICU声卡安装调试教程
  12. 新浪微博系统 Xweibo v1.1.1beta 免费版Xweibo-Xweibo 软件系统简介(PHP+MYSQL)
  13. 如何解锁PDF的打印限制
  14. 带通滤波器电路图设计(转)
  15. 学习oracle一个月心得
  16. 推荐一本 Bulma 的书《使用Bulma来创建用户界面》
  17. 电商平台减少服务器性能,电商平台服务器数据安全灾备方案规划.doc
  18. 【开心一刻】又想让马儿跑,又不给马儿吃草!
  19. openwrt 开启软看门狗
  20. Ribbons界面介绍(3)——设计思想

热门文章

  1. 包包各部位名称图解_[原创]整理出的包包名称及各部位英语集
  2. 清华大学历任计算机学院院长,历任领导
  3. CSP201912-3 化学方程式
  4. 水桥月游戏测试之旅——写于起点的终点话
  5. 怎么样用计算机解锁密码忘了,电脑开机密码忘了怎么办_怎样跳过电脑开机密码...
  6. UOS在计算机和前端无法识别到U盘
  7. javacv实现拉流播放
  8. 基于HMM的中文词性标注 POSTagging
  9. 力扣算法1~10题(js)
  10. Python学习——乘方运算符(**)的结合性