如何优雅的实现DML批量操作
如何優(yōu)雅的實現(xiàn)DML批量操作(轉(zhuǎn)載)
?
昨天處理了一個業(yè)務(wù)同學(xué)的數(shù)據(jù)需求,簡單來說就是對一張大表做一下數(shù)據(jù)清理,數(shù)據(jù)量在8千萬左右,需要保留近一個月的數(shù)據(jù),大概是400萬左右。
對于數(shù)據(jù)的刪除處理,尤其是大表的處理,可以借助MySQL特有的一種處理策略,可以參考之前的文章:
從處理方式來看,基本就是做了rename,把原來表的數(shù)據(jù)轉(zhuǎn)置到一個中間庫里面,然后補(bǔ)錄數(shù)據(jù),對于日志型的數(shù)據(jù)表來說是很有必要的。
?
但是這種方式涉及幾個細(xì)節(jié),主要的出發(fā)點就是怎么樣讓這個操作更加可控,我所說的意思是整個處理過程你可以按部就班的操作,該備份備份,而補(bǔ)錄補(bǔ)錄,而對線上的切換過程都是毫秒級完成,幾乎產(chǎn)生不了直接影響,要實現(xiàn)這個看似不大可能的需求,我們就需要設(shè)定幾個邊界:
1)數(shù)據(jù)類型為流水型業(yè)務(wù),不涉及事務(wù)處理
2)數(shù)據(jù)流程不會修改歷史數(shù)據(jù),僅僅參考近N(可以為N,也可以為當(dāng)天)的數(shù)據(jù)
3)操作的時機(jī)不是業(yè)務(wù)高峰期
4)能夠接受秒級的數(shù)據(jù)寫入閃斷
明確了這些不能夠之后,我們來看看怎么來實現(xiàn)這個目標(biāo),可以參考如下的流程圖:
?
所以要實現(xiàn)這個目標(biāo),我們需要盡可能保證中轉(zhuǎn)表的數(shù)據(jù)要盡可能完整,而且要保證數(shù)據(jù)切換能夠高效完成。
那么我們處理的思路就是增量迭代,即最后的切換階段耗時最短,我們可以提前復(fù)制需要補(bǔ)錄的數(shù)據(jù),同時對當(dāng)天的數(shù)據(jù)進(jìn)行增量的補(bǔ)錄,然后開始切換。
我們可以參考如下的步驟:
1)首先創(chuàng)建同樣結(jié)構(gòu)的表,包括索引,一個表是做備份,一個是作為中轉(zhuǎn)。
mysql> create table cmec_log_arch.log like cmec_log.log;
mysql>?create table cmec_log_arch.log_new?like cmec_log.log;
2)需要把近一個月的數(shù)據(jù)表現(xiàn)存放到中轉(zhuǎn)表log_new里面,為了提高效率,我們先保證當(dāng)天的數(shù)據(jù)有效。
mysql> ?insert into cmec_log_arch.log_new? select * from cmec_log.log? where cdate between '2019-09-18' and '2019-09-18 10:00:00';? ?--當(dāng)前時間大于10:00:00,但是間隔不大
我們可以縮小時間間隔,完成增量數(shù)據(jù)的補(bǔ)錄,直到增量數(shù)據(jù)的補(bǔ)錄時長控制在秒級(數(shù)據(jù)集越小,處理時長越短)
2)然后切換表
mysql> RENAME TABLE cmec_log.log? ? TO cmec_log_arch.log_bak,
? ? ? ? ? ? ? ? ? cmec_log_arch.log? ? TO cmec_log.log,
? ? ? ? ? ? ? ? ? cmec_log_arch.log_bak TO cmec_log_arch.log;?
Query OK, 0 rows affected (0.18 sec)
整個切換過程是很快的。
4)接著我們進(jìn)行歷史數(shù)據(jù)的補(bǔ)錄,完成了當(dāng)天數(shù)據(jù)的補(bǔ)錄,我們只需要關(guān)注歷史數(shù)據(jù)的范圍即可。
為了盡可能降低對岸上環(huán)境的應(yīng)縣個,我們需要縮小補(bǔ)錄的時間范圍,比如按照如下的方式來進(jìn)行補(bǔ)錄:insert into cmec_log.log select * from cmec_log_arch.log_new where cdate between '2019-09-16'? and '2019-09-17';? ?
因為結(jié)果集相對小一些,處理過程對已有的數(shù)據(jù)處理線程的效率影響最小,可以避免大結(jié)果集導(dǎo)致服務(wù)阻塞的情況。
當(dāng)然關(guān)鍵的部分是整個流程梳理完善后固定下來,我們可以把它轉(zhuǎn)換成一個腳本,這樣后續(xù)的操作我們只需要輸入表名,保留的時間范圍即可完成這個看起來略微復(fù)雜的需求了。?
 原文鏈接:https://blog.csdn.net/yangjianrong1985/article/details/102479380
?
總結(jié)
以上是生活随笔為你收集整理的如何优雅的实现DML批量操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 如何优化MySQL千万级大表
- 下一篇: SELECT COUNT语句
