Mysql數據壓縮(表或列壓縮)

問題:當用戶量上升到一定數據時,mysql存在性能問題,如何減少表數據存儲空間進行下面優化
MySQL自帶壓縮和解壓縮函數

1 表列數據壓縮

測試數據270w條存表(room_record1)中存儲空間9G

CREATE TABLE `room_record1` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `room` int(11) NOT NULL,
  `uuid` varchar(100) NOT NULL,
  `info` blob NOT NULL,
  `timestamp` int(11) NOT NULL,
  `type` int(11) NOT NULL,
  PRIMARY KEY (`id`,`timestamp`),
  KEY `room` (`room`),
  KEY `uuid` (`uuid`),
  KEY `idx_timestamp` (`timestamp`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

在這裏插入圖片描述
優化字段:壓縮info字段
佔用空間:
在這裏插入圖片描述

優化表結構:

CREATE TABLE `room_record2` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `room` int(11) NOT NULL,
  `uuid` varchar(100) NOT NULL,
  `info` blob NOT NULL,
  `timestamp` int(11) NOT NULL,
  `type` int(11) NOT NULL,
  PRIMARY KEY (`id`,`timestamp`),
  KEY `room` (`room`),
  KEY `uuid` (`uuid`),
  KEY `idx_timestamp` (`timestamp`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

INSERT INTO  `room_record2` (`id`, `room`, `uuid`, `info`, `timestamp`, `type`) VALUES ('202737598', '434436', 'f2ba4943-6779-494d-a103-0b86873462a3',compress( '[[0,2,\"4s\",[1,431642,-500,\"1s,1b,2s,2s,2b,2b,3b,4b,5s,8b,9s,9s,9b,Tb\",-2,-2,0,-1,\"194.5\"],[2,634577,295,\"2s,2s,2b,2b,3b,4b,4b,5b,6s,6s,7s,7b,8s,9b\",-2,-2,0,-1,\"829\"],[0,2,2,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,10,1,0,2,5,{\"min_gold_ka\":3,\"less_score_free\":5,\"limit_enter_battle_score\":50,\"limit_battle_score\":20,\"score_limit_open\":1,\"score_max_limit\":11,\"min_limit_gold_ka\":100,\"score_limit_open1\":1,\"score_max_limit1\":150,\"min_limit_gold_ka1\":300,\"less_score_reback_header\":-1,\"choupai_num\":0,\"tuoguan\":120,\"noreback\":0,\"beilv\":50,\"fanbei\":2,\"less_score\":5,\"fanbei_open\":1,\"add_score_open\":0,\"less_score_add_level\":1,\"add_score\":1,\"hutoall\":0,\"zhangshu\":3,\"changshuang\":1,\"tuoguan_mode\":1}]],[1,2,12,\"4s\",0,0,[[1,0,0],[2,0,0]]],[1,2,11,\"9b\",0,0,[[1,0,0],[2,0,0]]],[2,1,\"2,\"],[1,1,1,\"9b,9s,9s,9b,8b,Tb\",0,0,[[1,0,0],[2,0,0]]],[1,1,11,\"4b\",0,0,[[1,0,0],[2,0,0]]],[2,2,\"1,2,\"],[1,2,2,\"4b,4b,4b\",3,0,[[1,0,0],[2,0,0]]],[1,2,11,\"4s\",3,0,[[1,0,0],[2,0,0]]],[1,2,7,\"4s\",3,0,[[1,0,0],[2,0,0]]],[1,1,12,\"1s\",0,0,[[1,0,0],[2,0,0]]],[2,1,\"2,\"],[1,1,10,\"1s\",0,0,[[1,0,0],[2,0,0]]],[1,1,7,\"1s\",0,0,[[1,0,0],[2,0,0]]],[1,2,12,\"Ts\",3,0,[[1,0,0],[2,0,0]]],[1,1,9,\"\",0,0,[[1,0,0],[2,0,0]]],[1,1,12,\"Ts\",9,0,[[1,0,4],[2,0,-4]]],[3,1,[1,4,4,-500],[2,-4,-4,295],[1,\"1s,1b,2s,2s,2b,2b,3b,5s\"],[2,\"2s,2s,2b,2b,3b,5b,6s,6s,7s,7b,8s\"],[1,2,1,4,-1,0,2,-4,-1,0,3,1,\"Ts\",0,0,29,\"5s\",\"7b\",\"Tb\",\"4b\",\"5b\",\"6s\",\"9b\",\"3s\",\"3s\",\"9s\",\"6b\",\"Tb\",\"1s\",\"4s\",\"8s\",\"Ts\",\"7b\",\"6b\",\"3s\",\"Tb\",\"5b\",\"1b\",\"8b\",\"Ts\",\"7s\",\"7b\",\"5s\",\"5s\",\"7s\",2,1,8,\"1s\",\"1b\",\"2s\",\"2s\",\"2b\",\"2b\",\"3b\",\"5s\",2,11,\"2s\",\"2s\",\"2b\",\"2b\",\"3b\",\"5b\",\"6s\",\"6s\",\"7s\",\"7b\",\"8s\",5,5,0,3,\"9b\",\"9s\",\"9s\",3,0,3,\"9b\",\"8b\",\"Tb\",2,6,3,\"1b\",\"2b\",\"3b\",2,3,3,\"1s\",\"5s\",\"Ts\",5,0,3,\"2s\",\"2s\",\"2b\",9,4,\"Ts\",2,1,4,2,-4,2,434436,1,0,1582128000,4,10,0]]]'), '1582128000', '18');

先說明一下Blob的類型
1、MySQL有四種BLOB類型:
  ·tinyblob:僅255個字符
  ·blob:最大限制到65K字節
  ·mediumblob:限制到16M字節
  ·longblob:可達4GB
2、除了類型對後面存取文件大小有限制,還要修改mysql的配置文件。
  Windows、linux基本一樣通過修改文件my.ini或my.cnf文件,在文件中增加 max_allowed_packet=10M(就是最大10M,mysql默認似乎1MB,增加前先查找一下確保沒有設置過)
3、做了以上設置後,如果上傳較大一點文件時或者某些文件時還是出錯,如報一些亂碼,估計就是下面的問題了。
數據庫或表的字符集問題,如hibernate連接使用utf-8,表是gbk等,一般只要設置hibernate中數據連接部分就行,如
jdbc:mysql://192.168.0.4:3306/test?useUnicode=true&characterEncoding=UTF-8

  • 壓縮
    使用函數COMPRESS :COMPRESS(COL)即可,如下圖,是一個測試壓縮的一列。壓縮後列格式爲blob格式BLOB字段用於存儲二進制數據,是一個可以存儲大量數據的容器),壓縮率能達到80~90%
  • 解壓
    使用函數UNCOMPRESS :UNCOMPRESS(col)即可,由於被壓縮後代額格式是blob,那麼解壓後的格式也爲blob,還得轉換一層才能查看的到,如下所示:
select id,info '存儲的',UNCOMPRESS(info)'解壓的' ,cast(UNCOMPRESS(info) as char) '解壓並轉換' from room_record2

表(room_record2)數據:
在這裏插入圖片描述
優化壓縮後數據存儲空間:
在這裏插入圖片描述
總結:通過表列壓縮可以節省表存儲空間的60%效果,結果還是比較客觀

2 表數據壓縮

可以參考
表壓縮:https://www.cnblogs.com/mysql-dba/p/5125220.html

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