最近MySQL遇到一個表,其中有一個字段是存儲計算模型的所有值,是一個JSON長字符串,存儲爲longtext,基本每一個都有100k左右(正常不壓縮的情況),錶行數不到百萬,卻佔空間幾十G,於是想着MySQL能夠對專門的表字段進行壓縮,經過查詢發現,MySQL自帶壓縮和解壓縮函數
- 壓縮
使用函數COMPRESS :COMPRESS(COL)即可,如下圖,是一個測試壓縮的一列。壓縮後列格式爲blob格式BLOB字段用於存儲二進制數據,是一個可以存儲大量數據的容器),壓縮率能達到80~90%
select id,compress(info) from table
- 解壓
使用函數UNCOMPRESS :UNCOMPRESS(col)即可,由於被壓縮後代額格式是blob,那麼解壓後的格式也爲blob,還得轉換一層才能查看的到,如下所示:
select id,compress(info),uncompress(compress(info)) ,cast(uncompress(compress(info)) as char) from table
- 在JDBC中存取解壓縮
在SQL中可以搞定,壓縮後轉換。接下來
private static void insert () throws SQLException, IOException {
List<MyBlob> blobs=new ArrayList<MyBlob>();//MyBlob爲自定義的一個測試類
for(int i=0 ;i<5;i++){
MyBlob myBlob=new MyBlob();
myBlob.setId(i);
myBlob.setInfo("百度百科是百度公司推出的一部內容開放、自由的網絡百科全書。其測試版於2006年4月20日上線,正式版在2008年4月21日發佈,截至2019年8月,百度百科已經收錄了超1600萬詞條,參與詞條編輯的網友超過680萬人,幾乎涵蓋了所有已知的知識領域。 [1] \n" +
"“世界很複雜,百度更懂你”,百度百科旨在創造一個涵蓋各領域知識的中文信息收集平臺。百度百科強調用戶的參與和奉獻精神,充分調動互聯網用戶的力量,匯聚上億用戶的頭腦智慧,積極進行交流和分享。同時,百度百科實現與百度搜索、百度知道的結合,從不同的層次上滿足用戶對信息的需求。百度百科是百度公司推出的一部內容開放、自由的網絡百科全書。其測試版於2006年4月20日上線,正式版在2008年4月21日發佈,截至2019年8月,百度百科已經收錄了超1600萬詞條,參與詞條編輯的網友超過680萬人,幾乎涵蓋了所有已知的知識領域。 [1] \n" +
"“世界很複雜,百度更懂你”,百度百科旨在創造一個涵蓋各領域知識的中文信息收集平臺。百度百科強調用戶的參與和奉獻精神,充分調動互聯網用戶的力量,匯聚上億用戶的頭腦智慧,積極進行交流和分享。同時,百度百科實現與百度搜索、百度知道的結合,從不同的層次上滿足用戶對信息的需求。百度百科是百度公司推出的一部內容開放、自由的網絡百科全書。其測試版於2006年4月20日上線,正式版在2008年4月21日發佈,截至2019年8月,百度百科已經收錄了超1600萬詞條,參與詞條編輯的網友超過680萬人,幾乎涵蓋了所有已知的知識領域。 [1] \n" +
"“世界很複雜,百度更懂你”,百度百科旨在創造一個涵蓋各領域知識的中文信息收集平臺。百度百科強調用戶的參與和奉獻精神,充分調動互聯網用戶的力量,匯聚上億用戶的頭腦智慧,積極進行交流和分享。同時,百度百科實現與百度搜索、百度知道的結合,從不同的層次上滿足用戶對信息的需求。百度百科是百度公司推出的一部內容開放、自由的網絡百科全書。其測試版於2006年4月20日上線,正式版在2008年4月21日發佈,截至2019年8月,百度百科已經收錄了超1600萬詞條,參與詞條編輯的網友超過680萬人,幾乎涵蓋了所有已知的知識領域。 [1] \n" +
"“世界很複雜,百度更懂你”,百度百科旨在創造一個涵蓋各領域知識的中文信息收集平臺。百度百科強調用戶的參與和奉獻精神,充分調動互聯網用戶的力量,匯聚上億用戶的頭腦智慧,積極進行交流和分享。同時,百度百科實現與百度搜索、百度知道的結合,從不同的層次上滿足用戶對信息的需求。百度百科是百度公司推出的一部內容開放、自由的網絡百科全書。其測試版於2006年4月20日上線,正式版在2008年4月21日發佈,截至2019年8月,百度百科已經收錄了超1600萬詞條,參與詞條編輯的網友超過680萬人,幾乎涵蓋了所有已知的知識領域。 [1] \n" +
"“世界很複雜,百度更懂你”,百度百科旨在創造一個涵蓋各領域知識的中文信息收集平臺。百度百科強調用戶的參與和奉獻精神,充分調動互聯網用戶的力量,匯聚上億用戶的頭腦智慧,積極進行交流和分享。同時,百度百科實現與百度搜索、百度知道的結合,從不同的層次上滿足用戶對信息的需求。\n" +
"百度百科是百度公司推出的一部內容開放、自由的網絡百科全書。其測試版於2006年4月20日上線,正式版在2008年4月21日發佈,截至2019年8月,百度百科已經收錄了超1600萬詞條,參與詞條編輯的網友超過680萬人,幾乎涵蓋了所有已知的知識領域。 [1] \n");
blobs.add(myBlob);
}
//批量插入,只需要在對應列加入compress函數即可
String insertSql="insert into test_db.blob_test (id,info) values(?,COMPRESS(?))";
PreparedStatement psInsert=connection.prepareStatement(insertSql);
for(MyBlob b:blobs){
psInsert.setInt(1,b.getId());
psInsert.setString(2,b.getInfo());
psInsert.addBatch();
}
psInsert.executeBatch();
psInsert.close();
//測試單條插入
String insertSql2="insert into test_db.blob_test (id,info) values(?,COMPRESS(?))";
for(MyBlob b:blobs) {
PreparedStatement psInsert2=connection.prepareStatement(insertSql2);
psInsert2.setInt(1,b.getId());
psInsert2.setString(2,b.getInfo());
psInsert2.executeUpdate();
}
System.out.println("---");
}
private static void select() throws SQLException, IOException {
//此處省略代碼示例,讀取的時候只需要sql語句中帶有compress即可,其他的不變
//如:select id,cast(uncompress(info) as char)info from test_db.blob_test
}
在SQL中查詢測試
select id,info 存儲的,UNCOMPRESS(info)解壓的 ,cast(UNCOMPRESS(info) as char)解壓並轉換 from test_db.blob_test
經過對專門大字段壓縮後更新後代碼成程序後,表空間節省了80%的空間。原先大概一萬條就佔用月1G的空間。現在1w條大概100~200m;