祖仙教小凡仙 海鯊數據庫架構師 數據庫
前篇連接 設計AB表
今天我跟朋友繼續討論AB表設計的應用場景, 從上面來講 就那麼幾個場景能夠使用. DBA說能夠用分區交換方式替代. 真的嗎? A B表就這點生產空間嗎?
非也 ! 由於2016年的靈感的激發,毫不是這些場景引發來的.架構
什麼場景下使用AB表?
1 如上面的業務只讀,數據由外部裝入
2 跨年表 由於業務上新年一過就不處理去年的業務
3 日誌寫表 應用不斷往一個表寫入日誌,該日誌只是爲了審計,不參與業務。日誌表太大了,經過常規方式清理會影響日誌寫的程序。ide
難道不能應用在業務相關的表嗎? 好像也能夠哦,只有解決了讀的問題,
好比說先讀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