链表"/>
mysql 拉链表
一、前言
在上一节简单介绍了拉链表,本节主要讲解如何通过binlog采集MySQL的数据并且按月分区的方式实现拉链表。
这里以上节介绍的用户表(user) 举例
二、涉及到的表
1. 原始表(user)
原始表指的是MySQL中的表,表结构如下:
其中name为主键,如果没有主键则无法做拉链表。
2. binlog流水表(user_binlog)
操作类型字段枚举值为:insert、update、delete。
设置binlog时间 的目的是防止业务方没有设置modify_time导致获取不到最新的更新时间,所以增加binlog时间。
日期分区字段是从binlog_time计算得来,作为分区字段
3. 拉链表(user_link)
这里包含的字段除去原始表的字段增加了生效日期及失效日期具体作用已经在上一节介绍过,这里就不再赘述。
4. 临时表(user_link_tmp)
这张表的用途是: 在数据从user_binlog写入user_link时,临时表起到中转的作用。并且临时表没有分区。
三、计算流程
1. 整体数据流向
2. user到user_binlog
数据从user表到user_binlog表可以采用开源的采集binlog工具实时写入。具体的实施方案和选择的开源工具有关,这里不详细介绍。
3. user_binlog到user_link
(1) 常规流程
把数据从binlog表同步到拉链表中主要分两步:删除拉链表中失效的数据: 这里包括update和delete类型的数据,都涉及到删除原始拉链表的数据。在这一步骤中有两个子步骤将拉链表中失效的失效日期字段改为批次日期
从拉链表原有分区中删除失效的数据
插入新的数据:这一步骤涉及到的操作类型包含insert和update
接下来会以7月11日执行的SQL举例,详细介绍如何把binlog表的数据同步到拉链表中。其中的SQL涉及到先把binlog表中的数据同步到临时表,并把临时表写入到拉链表。
-- 先清空临时表的数据。-- 理论上这张表已经是清空的。-- 这里清空主要是防止异常清空,导致上一批次没有清空临时表truncate t
更多推荐
mysql 拉链表
发布评论