幾個縮減MySQL以節儉磁盤空間的建議。本站提示廣大學習愛好者:(幾個縮減MySQL以節儉磁盤空間的建議)文章只能為提供參考,不一定能成為您想要的結果。以下是幾個縮減MySQL以節儉磁盤空間的建議正文
我們在任務中經常會碰到一些客戶的TPS\QPS都不太高,但磁盤占用異常年夜,一旦單實例空間太年夜,像內存、收集、CPU和備份都將增長響應的開支。能夠僅僅是因為空間不知足使得我們不能不停止擴容,上面的辦法供給給年夜家參考。有則改之無則加勉。
1、表構造設計上
1) 字符集能否遵守了最小化准繩?(能用latin的就不消gbk。能用gbk的就不消utf8)
2) 索引上能否有濫用?(基本不應用的字段建索引、不合適建索引的字段建索引、反復建索引或許不克不及很好的應用前綴索引等)
3) 冗余字段能否太多?(各表中不消的或許字段冗余太多)
4) 不准確的字段類型?(能用1個字節非要用幾個字節,像列舉類、狀況類比擬罕見)
5) 將較長的字段或許幾個字段組合做為主鍵?(主鍵最好用mysql自增)
詳細事例以下:
CREATE TABLE `class_meta` ( `class_name` varchar(128) NOT NULL COMMENT '類名', `class_desc` varchar(2048) default '' COMMENT '類的描寫', `class_status` char(20) default 'test1' COMMENT 'test1,test2', PRIMARY KEY (`class_name`), UNIQUE KEY `cm_cn_uk` (`class_name`), KEY `cm_cd_ind` (`class_desc`(767)), KEY `cm_cs_ind` (`class_status`), KEY `cm_cdcn_ind` (`class_desc`(767),`class_name`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='meta信息';
經由過程下面的表構造能看到以下處所不適合
1、主鍵與獨一索引顯著反復,索引cm_cd_ind與索引cm_cdcn_ind索引反復(這類情形常常湧現,年夜家留心下)
2、cm_cs_ind假如兩個狀況散布平均也顯著不適合建索引
3、class_desc因為是描寫性質的,也不適合建索引
4、最好以自增做為主鍵,可以削減整表的空間
5、class_status列顯著可以用tinyint來存,可以省下19個字節
2、存儲內容上
1) 能否將圖片、視頻、音樂等年夜數據存儲在表中?(內外最好只保存途徑而不是現實的文件內容)
3、數據保存上
1)能否有已過時而未刪除的數據?(關於有效數據實時清算或許停止汗青歸檔)
4、前期保護上
1)能否對常常刪除的表停止保護(optimize table)
建議:
1、在機能請求不高的case中(並發不太高),可以斟酌應用緊縮表。普通緊縮率在30%-70%之間,收益異常可不雅。
2、關於刪除異常頻仍的表要按期停止優化,使表中碎片削減。進步查詢、寫入的機能。
3、在表構造設計上,必定要發揚“锱铢必較”的精力,能用1個字節表現的果斷不消2個字節。
4、盡可能削減年夜字段的應用。
ps:常常在跟開辟評審表構造的時刻,經常會被笑話說DBA太摳門,一點都不年夜氣。當數據量小的時刻能夠年夜家不認為,但當你的數據級到T或許P的時刻,哪怕多省幾個字節都長短常可不雅的,給年夜家簡略算筆賬,假如我們將一張5億筆記錄的表,字段從100個字節降到60個字節(應當很輕易做到吧),那末不算上索引將勤儉年夜約18G的空間。