MySQL中大字段列壓縮

最近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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章