A B 表設計思路之續

A B 表設計思路之續

祖仙教小凡仙 海鯊數據庫架構師 數據庫

前篇連接 設計AB表
今天我跟朋友繼續討論AB表設計的應用場景, 從上面來講 就那麼幾個場景能夠使用. DBA說能夠用分區交換方式替代. 真的嗎? A B表就這點生產空間嗎?
非也 ! 由於2016年的靈感的激發,毫不是這些場景引發來的.架構

什麼場景下使用AB表?
1 如上面的業務只讀,數據由外部裝入
2 跨年表 由於業務上新年一過就不處理去年的業務
3 日誌寫表 應用不斷往一個表寫入日誌,該日誌只是爲了審計,不參與業務。日誌表太大了,經過常規方式清理會影響日誌寫的程序。ide

A B 表設計思路之續
難道不能應用在業務相關的表嗎? 好像也能夠哦,只有解決了讀的問題,
好比說先讀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
相關文章
相關標籤/搜索