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的空間。
您可能感興趣的文章:SqlServer如何通過SQL語句獲取處理器(CPU)、內存(Memory)、磁盤(Disk)以及操作系統相關信息ubuntu下磁盤空間不足導致mysql無法啟動的解決方法Mysql存儲引擎MyISAM的常見問題(表損壞、無法訪問、磁盤空間不足)lnmp下如何關閉Mysql日誌保護磁盤空間Mysql InnoDB刪除數據後釋放磁盤空間的方法MySQL中查詢所有數據庫占用磁盤空間大小和單個庫中所有表的大小的sql語句mssql 監控磁盤空間告警實現方法SQL Server獲取磁盤空間使用情況