mysql資料庫實現億級資料快速清理

2021-10-10 12:42:05 字數 1563 閱讀 2782

今天收到磁碟報警異常,50g的磁碟被撐爆了,分析解決過程如下:

1. 進入linux伺服器,檢視mysql資料夾中各個資料庫所佔的磁碟空間大小

看到了嗎,光olderdb就佔了25g

2. 用sqlyog登入mysql資料庫,檢視資料庫各個表的占用空間情況

select concat(table_schema,'.',table_name) as 'aaa',   

table_rows as 'number of rows',   

concat(round(data_length/(1024*1024*1024),6),' g') as 'data size',   

concat(round(index_length/(1024*1024*1024),6),' g') as 'index size' ,   

concat(round((data_length+index_length)/(1024*1024*1024),6),' g') as'total'  

from information_schema.tables   

where table_schema like 'olderdb';

3. 查詢主鍵索引

採取策略

前提:目前需要刪除80%的資料

① delete語句

我們知道delete語句的刪除速度與索引量成正比,此表中的索引量已經很大了,而且資料量非常之巨大,若採用常規delete語句刪除,必定會話費幾天的時間。

delete語句刪除不會釋放出磁碟空間,所以肯定還是會出現報警,所以此種方式不可取。

② drop掉表

新建結構相同的表,命名「cc」,』將需要儲存的資料插入到此表中,然後drop掉老表。

sql語句如下:

基於老表新建新錶

create table cc like orbit ;

插入資料(幾百萬的資料量一定要分批插入,一次30萬-40萬為最佳,畢竟mysql的資料處理能力有限)

按日期查詢後插入(每天大概會產生30多萬資料量,所以採用日期插入)

insert into cc select * from orbit where xttime > '2018-04-16 00:00:00' and xttime<='2018-04-17 00:00:00';

結果如下:

可以看到50多萬的資料量用了不到5分鐘,還是比較快的。

清理後資料表空間得以釋放

然後drop掉老表

drop table orbit

目測只用了3秒左右

重新命名新錶「cc」

alter table cc rename to orbit

mysql資料庫實現億級資料快速清理

今天收到磁碟報警異常,50g的磁碟被撐爆了,分析解決過程如下 1.進入linux伺服器,檢視 mysql 資料夾中各個資料庫所佔的磁碟空間大小 看到了嗎,光olderdb就佔了 25g2.用sqlyog登入 mysql 資料庫,檢視資料庫各個表的占用空間情況 select concat table ...

mysql億級資料遷移

背景 mysql5.6 分庫分表 跨資料庫例項,要求線上遷移 切換功能 檢視各資料庫占用磁碟空間大小 select table schema,concat truncate sum data length 1024 1024,2 mb as data size,concat truncate sum...

基於Mysql資料庫億級資料下的分庫分表方案

目前網際網路上有許多的版本,比較知名的一些方案 以查詢索引列進行分割槽,例如,對於流水表a,查詢需要根據手機號和批次號進行查詢,所以我們在建立分割槽的時候,就選擇以手機號和批次號進行分割槽,這樣設定後,查詢都會走索引,每次查詢mysql都會根據查詢條件計算出來,資料會落在那個分割槽裡面,直接到對應的...