記一次資料同步需求的改進(一)
最近有個需求,開發的同事找到我,提出了下面的需求
由於平臺業務發展需要,需要將test_account_log 和test_protect_log 表前一天的增量同步到新增的兩張表上
對於這個需求看起來還是蠻簡單的。自己結合這兩張報的設計方式發現沒那麼簡單。
首先對這兩個表做了分庫分表,從圖中可以看到,其實分成了4個庫,16個使用者,每個使用者按照業務邏輯儲存了一部分的明細資料,從目前的資料量來看,累計資料還不算大。
如果按照開發的需求,需要抽取保留前一天的增量資料,這個需求還是需要好好斟酌的。
因為是評估,還是要做一些工作的,不能憑空來想決定可不可行,
首先來抓取了
我抓取了部分使用者下表中資料的增長情況,這個過程還是在備庫完成,基本每天的資料變化頻率不高,下面是test_account_log的資料情況,test_protect_log的頻率要更低一些。
2015-10-05 7487
2015-10-06 8140
2015-10-07 8436
2015-10-08 7763
2015-10-09 13933
2015-10-10 15391
2015-10-11 9357
2015-10-12 7680
2015-10-13 5575
2015-10-14 5427
2015-10-15 5697
2015-10-16 6095
2015-10-17 7370
2015-10-18 6869
2015-10-19 5634
2015-10-20 5562
2015-10-21 4900
2015-10-22 694
可以看出每天的資料變更其實不大,10多個累計起來就幾萬,還是比較小的,從增量資料的情況來看,還是很容易能夠實現的。
如果每天的都在百萬,千萬,那就需要進一步評估確認了。
於是我提了下面幾個問題,把這些問題的責任人都指定,誰來負責確認哪些都標明,因為這個還是需要協同來完成。
1.提供增量抽取sql語句 --開發同學
請從業務上評估,提供增量抽取sql語句。
取昨天的增量:
後續得到開發同學的反饋,發現這個operation_date欄位上沒有相關的索引,也就意味著這種抽取還是會有潛在的風險。
select * from test_account_log where operation_date>=to_date(‘2015-10-25’,’yyyy-mm-dd’) and operation_date=to_date(‘2015-10-25’,’yyyy-mm-dd’) and operation_date<to_date(‘2015-10-26’,’yyyy-mm-dd’)
2. 目前test_account_log,test_protect_log沒有operation_date相關的索引,需要建立額外的索引 --開發同學,DBA
因為不存在相關的索引,所以還是需要考慮能夠新增索引,如果能夠新增,索引列是為多個相關欄位還是單單為operation_date
開發同學的反饋,建立索引的語句為:
create index account_log_date on test_account_log (operation_date)
create index protect_log_date on test_protect_log (operation_date)
對這個索引的建立,我需要從歷史的sql執行情況來分析是否合適,是否會有潛在的原因導致執行計劃的變更。
3.請確認是否operation_date為變化欄位,如果這個值發生變化,增量抽取的資料就會有問題。--開發同學
比如 log_id uid operation_date
1 100 2015-10-21 xxxx
如果發生變化
1 100 2015-10-23 xxxx
在增量抽取的資料中就會存在重複資料(log_id,uid.xxxx)
這一點看似會忽略,但是卻是至關重要,因為僅僅根據開發的需求來完成,如果不考慮這種資料變更的影響,那後面就會有非常多的隱患。
得到開發同學的反饋為:
該表的資料都不會變化,只會增加。因為這個表是一個歷史資料表,所以裡面的資料是不會修改的。
4.彙總後的表放哪兒確認完再討論,技術上是可以支援的。不過基於安全和後期資料量的情況,還是需要找領導審批 --找主管審批確認
所以一個簡單的問題仔細分析之後,還是在於其範圍之內,可以很容易就實現的。後續的就是實施的過程了,當然這個過程會有很多的轉折點,可能會對這個需求產生更大的影響,甚至推翻需求重來,後續再來解讀。
</to_date(‘2015-10-26’,’yyyy-mm-dd’)
由於平臺業務發展需要,需要將test_account_log 和test_protect_log 表前一天的增量同步到新增的兩張表上
對於這個需求看起來還是蠻簡單的。自己結合這兩張報的設計方式發現沒那麼簡單。
首先對這兩個表做了分庫分表,從圖中可以看到,其實分成了4個庫,16個使用者,每個使用者按照業務邏輯儲存了一部分的明細資料,從目前的資料量來看,累計資料還不算大。
如果按照開發的需求,需要抽取保留前一天的增量資料,這個需求還是需要好好斟酌的。
因為是評估,還是要做一些工作的,不能憑空來想決定可不可行,
首先來抓取了
我抓取了部分使用者下表中資料的增長情況,這個過程還是在備庫完成,基本每天的資料變化頻率不高,下面是test_account_log的資料情況,test_protect_log的頻率要更低一些。
2015-10-05 7487
2015-10-06 8140
2015-10-07 8436
2015-10-08 7763
2015-10-09 13933
2015-10-10 15391
2015-10-11 9357
2015-10-12 7680
2015-10-13 5575
2015-10-14 5427
2015-10-15 5697
2015-10-16 6095
2015-10-17 7370
2015-10-18 6869
2015-10-19 5634
2015-10-20 5562
2015-10-21 4900
2015-10-22 694
可以看出每天的資料變更其實不大,10多個累計起來就幾萬,還是比較小的,從增量資料的情況來看,還是很容易能夠實現的。
如果每天的都在百萬,千萬,那就需要進一步評估確認了。
於是我提了下面幾個問題,把這些問題的責任人都指定,誰來負責確認哪些都標明,因為這個還是需要協同來完成。
1.提供增量抽取sql語句 --開發同學
請從業務上評估,提供增量抽取sql語句。
取昨天的增量:
後續得到開發同學的反饋,發現這個operation_date欄位上沒有相關的索引,也就意味著這種抽取還是會有潛在的風險。
select * from test_account_log where operation_date>=to_date(‘2015-10-25’,’yyyy-mm-dd’) and operation_date=to_date(‘2015-10-25’,’yyyy-mm-dd’) and operation_date<to_date(‘2015-10-26’,’yyyy-mm-dd’)
2. 目前test_account_log,test_protect_log沒有operation_date相關的索引,需要建立額外的索引 --開發同學,DBA
因為不存在相關的索引,所以還是需要考慮能夠新增索引,如果能夠新增,索引列是為多個相關欄位還是單單為operation_date
開發同學的反饋,建立索引的語句為:
create index account_log_date on test_account_log (operation_date)
create index protect_log_date on test_protect_log (operation_date)
對這個索引的建立,我需要從歷史的sql執行情況來分析是否合適,是否會有潛在的原因導致執行計劃的變更。
3.請確認是否operation_date為變化欄位,如果這個值發生變化,增量抽取的資料就會有問題。--開發同學
比如 log_id uid operation_date
1 100 2015-10-21 xxxx
如果發生變化
1 100 2015-10-23 xxxx
在增量抽取的資料中就會存在重複資料(log_id,uid.xxxx)
這一點看似會忽略,但是卻是至關重要,因為僅僅根據開發的需求來完成,如果不考慮這種資料變更的影響,那後面就會有非常多的隱患。
得到開發同學的反饋為:
該表的資料都不會變化,只會增加。因為這個表是一個歷史資料表,所以裡面的資料是不會修改的。
4.彙總後的表放哪兒確認完再討論,技術上是可以支援的。不過基於安全和後期資料量的情況,還是需要找領導審批 --找主管審批確認
所以一個簡單的問題仔細分析之後,還是在於其範圍之內,可以很容易就實現的。後續的就是實施的過程了,當然這個過程會有很多的轉折點,可能會對這個需求產生更大的影響,甚至推翻需求重來,後續再來解讀。
</to_date(‘2015-10-26’,’yyyy-mm-dd’)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1817817/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 記一次資料同步需求的改進(三)
- 記一次資料同步需求的改進(二)
- MySQL資料清理的需求分析和改進MySql
- 需求改進&系統設計
- 記一次資料恢復資料恢復
- 記一次資料遷移
- 記錄一次產品需求中使用的一條 MySQLMySql
- 資料重新整理中的並行改進(一)並行
- 記一次產品需求中的陣列排序方法陣列排序
- 記一次資料庫hang住了資料庫
- 需求改進與系統設計
- 關於 es 資料同步的一次效能優化實踐優化
- 記一次多程式同步Cookie的解惑歷程Cookie
- 記一次資料庫索引引起的當機。。。資料庫索引
- 記一次資料庫刪表事件資料庫事件
- 基於DataX的資料同步(下)-應用DataX進行資料同步
- 記一次前後端資料加密的學習後端加密
- 資料庫日常遇到的需求筆記(自用)資料庫筆記
- 記一次mysql資料庫被勒索(中)MySql資料庫
- 記一次mysql資料庫被勒索(下)MySql資料庫
- 記錄一次資料儲存出錯
- 記一次刪庫到資料恢復資料恢復
- 記一次 MySQL 資料庫問題排查MySql資料庫
- 記錄一次在客戶現場進行資料採集的經歷與感想
- Spotify如何改進資料科學家的資料發現?資料科學
- 記一次小機器的 Python 大資料分析Python大資料
- 記一次電腦故障後找回資料的歷程
- 記一次 Golang 資料庫查詢元件的優化。Golang資料庫元件優化
- 記一次資料庫的分析和優化建議資料庫優化
- 記一次公司mssql server密碼頻繁被改的事件SQLServer密碼事件
- 記一次資料庫事故-ORA-15038資料庫
- 記錄一次mysql批量修改大量資料MySql
- 記一次客戶oracle資料庫崩潰Oracle資料庫
- 記一次刪除資料使用者定位
- Vuex 的非同步資料更新(小記)Vue非同步
- 氣泡排序的改進:一次同時冒一個大泡,一個小泡排序
- 利用Kettle進行資料同步(下)
- 利用Kettle進行資料同步(上)