mysql 大表批量刪除大量資料的實現方法

2022-09-24 10:30:13 字數 1019 閱讀 1343

問題參考自: ,mysql中程式設計客棧,一張表裡有3億資料,未分表,其中乙個欄位是企業型別,企業型別是一般企業和個體戶,www.cppcns.com個體戶的資料量差不多佔50%,根據條件把個體戶的行都刪掉。請問如何操作?答案為個人原創

假設表的引擎是 innodb, mysql 5.7+

刪除一程式設計客棧條記錄,首先鎖住這條記錄,資料原有的被廢棄,記錄頭發生變化,主要是打上了刪除標記。也就是原有的資料 deleted_flag 變成 1,代表資料被刪除。但是資料沒有被清空,在新一行資料大小小於這一行的時候,可能會占用這一行。這樣其實就是儲存碎片。

之後,相關資料的索引需要更新,清除這些資料。並且,會產生對應的 binlog 與 redolog 日誌。

如果 delete 的資料是大量的資料,則會:

我們很容易想到,在 delete 後加上 limit 限制控制其數量,這個數量讓他會走索引,從而不會鎖整個表。

但是,儲存碎片,主從同步,占用空間的問題並沒有解決。可以在刪除完成後,通過如下語句,重建表:

alter table 你的表 engine=innodb, algorithm=inplace, lock=none;

注意這句話其實就是重建你的表,雖然你的表的引擎已經是 innodb 了,加上後面的, algorithm=inplace, lock=none 可以不用鎖表就重建表。

還有一種方案是,新建一張同樣結構的表,在原有表上加上觸發器:

create trigger person_trigger_update after update on 原有表 for each row

begin set @x = "trigger update";

replace into 新錶 select * from 原有表 where 新錶.id = 原有表.id;

end if;

end;

這樣可以保證線上業務有新資料會同步。之後,將所有企業型別的資料,插入新錶,同時如果已存在則證明發生了更新同步就不插入。個體戶資料由於業務變化,並不在這個表上更新,所以這樣通過了無表鎖同步實現了大表的資料清理

mysql批量刪除大量資料

mysql批量刪除大量資料 假設有乙個表 syslogs 有1000萬條記錄,需要在業務不 停止的情況下刪除其中statusid 1的所有記錄,差不多 有600萬條,直接執行 delete from syslogs where statusid 1 會發現刪除失敗,因為lock wait timeo...

mysql批量刪除大量資料

mysql高階 十五 mysql批量刪除大量資料 雲瀟灑 假設有乙個表 syslogs 有1000萬條記錄,需要在業務不停止的情況下刪除其中statusid 1的所有記錄,差不多有600萬條,直接執行 delete from syslogs where statusid 1 會發現刪除失敗,因為lo...

mysql高階 十五 mysql批量刪除大量資料

假設有乙個表 syslogs 有1000萬條記錄,需要在業務不停止的情況下刪除其中statusid 1的所有記錄,差不多有600萬條,直接執行 delete from syslogs where statusid 1 會發現刪除失敗,因為lock wait timeout exceed的錯誤。因為這...