人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

MySQL 線上數(shù)據(jù)庫(kù)清理數(shù)據(jù)的方法

發(fā)布日期:2022-02-14 15:30 | 文章來(lái)源:源碼之家

01 場(chǎng)景分析

今天下午,開發(fā)的同事提來(lái)一個(gè)需求,需要在線上要?jiǎng)h除一些數(shù)據(jù)記錄,簡(jiǎn)單看了看數(shù)據(jù)的分布,大概是要?jiǎng)h除數(shù)據(jù)表中的兩千七百多萬(wàn)條記錄,數(shù)據(jù)表的總記錄是兩千八百多萬(wàn),也就是說(shuō),要?jiǎng)h除的記錄占了總記錄的絕大部分比重,兩千七百多萬(wàn)的數(shù)據(jù)記錄,要是刪除的話,使用的時(shí)間是相當(dāng)長(zhǎng)的,對(duì)線上的業(yè)務(wù)肯定會(huì)造成影響。這里將實(shí)際的應(yīng)用案例簡(jiǎn)單重構(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ù)庫(kù)中的表tbl_b按照date分組之后,每個(gè)組的數(shù)據(jù)量都不小,而我們的需求是將date為20190118和20190123的記錄刪除,可以看到這兩種記錄總計(jì)有兩千多萬(wàn)條,占了表中數(shù)據(jù)的絕大部分,如果直接刪除的話,線上的業(yè)務(wù)肯定會(huì)受到阻塞。

以下是操作方法,需要注意的是,應(yīng)用下面的操作方法的前提是:

要?jiǎng)h除的數(shù)據(jù)占了數(shù)據(jù)表中的絕大部分。

02 操作辦法

通過(guò)分析,知道剩余的表數(shù)據(jù)對(duì)于全表來(lái)說(shuō)是很小的一部分,這個(gè)操作我們分為4步:

1.我們先把剩余的數(shù)據(jù)存入到另外一個(gè)數(shù)據(jù)庫(kù)test1中:

create table test1.tbl_b_new as 
select * from test.tbl_b 
where date in(,,,,);

這個(gè)操作的時(shí)間只有3s左右;

2.我們?cè)趖est1數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)同名的表tbl_b,它的結(jié)構(gòu)和test數(shù)據(jù)庫(kù)中的tbl_b數(shù)據(jù)結(jié)構(gòu)一致:

create table test1.tbl_b like test.tbl_b;

3.緊接著,我們使用數(shù)據(jù)庫(kù)中的rename操作將表test中的表tbl_b和test1中的表tbl_b進(jìn)行交換,等價(jià)于將test數(shù)據(jù)庫(kù)中的表所有數(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ù)填充到新表中來(lái),如下:

insert into test.tbl_b select * from  test1.tbl_b_new;

03 結(jié)果分析

看上去我們好像把問(wèn)題搞復(fù)雜了,直接刪除的事情,被我們搞的多了好幾個(gè)步驟,但是實(shí)際上不是這樣的,這一套操作可以幫我們節(jié)省好幾分鐘時(shí)間,對(duì)線上業(yè)務(wù)的影響也更小,原因如下:

  1. 我們使用create table as的方法創(chuàng)建剩余的數(shù)據(jù)表,這種方法使我們僅對(duì)數(shù)據(jù)表中的少部分?jǐn)?shù)據(jù)進(jìn)行了操作。避免了我們對(duì)過(guò)多的數(shù)據(jù)進(jìn)行掃描。
  2. mysql中對(duì)大表進(jìn)行rename的操作,rename命令會(huì)直接修改底層的.frm文件,所以它的速度是相當(dāng)之快的。

第二個(gè)特點(diǎn)給我們提供了一種思路,在一個(gè)很著急的業(yè)務(wù)中,要使用一個(gè)表的時(shí)候,往往不給我們留充足的時(shí)間備份表,如果我們想要?jiǎng)h除一個(gè)大表里面的數(shù)據(jù),而且需要進(jìn)行相關(guān)備份,我們可以通過(guò)rename操作迅速處理,然后再想辦法去備份rename之后的表。

上面的例子中使用create table as 和create table like兩種克隆表的方式,有幾點(diǎn)需要注意:

create table like方式會(huì)完整地克隆表結(jié)構(gòu),但不會(huì)插入數(shù)據(jù),需要單獨(dú)使用insert into或load data方式加載數(shù)據(jù)
create table as 方式會(huì)部分克隆表結(jié)構(gòu),完整保留數(shù)據(jù)

如果有興趣,可以做做試驗(yàn)進(jìn)行驗(yàn)證。

以上就是MySQL 線上數(shù)據(jù)庫(kù)清理數(shù)據(jù)的方法的詳細(xì)內(nèi)容,更多關(guān)于MySQL 線上數(shù)據(jù)庫(kù)清理數(shù)據(jù)的資料請(qǐng)關(guān)注本站其它相關(guān)文章!

國(guó)外服務(wù)器租用

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部