目錄
- 01 場景分析
- 02 操作辦法
- 03 結(jié)果分析
01 場景分析
今天下午,開發(fā)的同事提來一個需求,需要在線上要刪除一些數(shù)據(jù)記錄,簡單看了看數(shù)據(jù)的分布,大概是要刪除數(shù)據(jù)表中的兩千七百多萬條記錄,數(shù)據(jù)表的總記錄是兩千八百多萬,也就是說,要刪除的記錄占了總記錄的絕大部分比重,兩千七百多萬的數(shù)據(jù)記錄,要是刪除的話,使用的時間是相當長的,對線上的業(yè)務(wù)肯定會造成影響。這里將實際的應(yīng)用案例簡單重構(gòu)為以下方法:
mysql> select date,count(*) from test.tbl_a group by date;
+----------+----------+
| date | count(*) |
+----------+----------+
| | 63103 |
| 20190118 | |
| | 125916 |
| 20190120 | |
| | 129198 |
| 20190122 | |
| | 5191247 |
+----------+----------+
rows in set (13.21 sec)
上面就是重構(gòu)之后的表的結(jié)構(gòu),我們可以看到,test數(shù)據(jù)庫中的表tbl_b按照date分組之后,每個組的數(shù)據(jù)量都不小,而我們的需求是將date為20190118和20190123的記錄刪除,可以看到這兩種記錄總計有兩千多萬條,占了表中數(shù)據(jù)的絕大部分,如果直接刪除的話,線上的業(yè)務(wù)肯定會受到阻塞。
以下是操作方法,需要注意的是,應(yīng)用下面的操作方法的前提是:
要刪除的數(shù)據(jù)占了數(shù)據(jù)表中的絕大部分。
02 操作辦法
通過分析,知道剩余的表數(shù)據(jù)對于全表來說是很小的一部分,這個操作我們分為4步:
1.我們先把剩余的數(shù)據(jù)存入到另外一個數(shù)據(jù)庫test1中:
create table test1.tbl_b_new as
select * from test.tbl_b
where date in(,,,,);
這個操作的時間只有3s左右;
2.我們在test1數(shù)據(jù)庫中創(chuàng)建一個同名的表tbl_b,它的結(jié)構(gòu)和test數(shù)據(jù)庫中的tbl_b數(shù)據(jù)結(jié)構(gòu)一致:
create table test1.tbl_b like test.tbl_b;
3.緊接著,我們使用數(shù)據(jù)庫中的rename操作將表test中的表tbl_b和test1中的表tbl_b進行交換,等價于將test數(shù)據(jù)庫中的表所有數(shù)據(jù)清除。
RENAME TABLE test.tbl_b TO test1.tbl_b_bak,
test1.tbl_b TO test.tbl_b,
test1.tbl_b_bak TO test1.tbl_b;
4.再講第一步保存的剩余數(shù)據(jù)填充到新表中來,如下:
insert into test.tbl_b select * from test1.tbl_b_new;
03 結(jié)果分析
看上去我們好像把問題搞復雜了,直接刪除的事情,被我們搞的多了好幾個步驟,但是實際上不是這樣的,這一套操作可以幫我們節(jié)省好幾分鐘時間,對線上業(yè)務(wù)的影響也更小,原因如下:
- 我們使用create table as的方法創(chuàng)建剩余的數(shù)據(jù)表,這種方法使我們僅對數(shù)據(jù)表中的少部分數(shù)據(jù)進行了操作。避免了我們對過多的數(shù)據(jù)進行掃描。
- mysql中對大表進行rename的操作,rename命令會直接修改底層的.frm文件,所以它的速度是相當之快的。
第二個特點給我們提供了一種思路,在一個很著急的業(yè)務(wù)中,要使用一個表的時候,往往不給我們留充足的時間備份表,如果我們想要刪除一個大表里面的數(shù)據(jù),而且需要進行相關(guān)備份,我們可以通過rename操作迅速處理,然后再想辦法去備份rename之后的表。
上面的例子中使用create table as 和create table like兩種克隆表的方式,有幾點需要注意:
create table like方式會完整地克隆表結(jié)構(gòu),但不會插入數(shù)據(jù),需要單獨使用insert into或load data方式加載數(shù)據(jù)
create table as 方式會部分克隆表結(jié)構(gòu),完整保留數(shù)據(jù)
如果有興趣,可以做做試驗進行驗證。
以上就是MySQL 線上數(shù)據(jù)庫清理數(shù)據(jù)的方法的詳細內(nèi)容,更多關(guān)于MySQL 線上數(shù)據(jù)庫清理數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- MySQL導出數(shù)據(jù)遇到secure-file-priv問題的解決方法
- MySQL 線上日志庫遷移實例
- mysql創(chuàng)建表添加字段注釋的實現(xiàn)方法
- MySQL 大表的count()優(yōu)化實現(xiàn)
- MySQL source命令的使用簡介
- MySQL too many connections錯誤的原因及解決
- 解決出現(xiàn)secure_file_priv null的問題