MySQL效能優化四之資料庫結構優化
1.選擇合適資料型別
1.1.使用可以儲存你資料型別的最小資料型別。
1.2.使用簡單的資料型別。
1.3.儘量使用NOT NULL定義欄位。
1.4.儘量少用大的型別(text),非用不可使用從表拆分出來。
1.5.例子:
1.5.1.利用Int型別儲存日期型別:利用FROM_UNIXTIME()函式(int轉日期型別)和UNIX_TIMESTAMP()函式(日期轉為int型別)。
1.5.2.IP地址儲存:使用BIGINT型別,利用INET_ATON()函式和INET_NTOA()函式(轉回成IP)。
2.表的正規化的優化
2.1.資料庫三大正規化:
1)每一列都是不可分割的基本資料項,同一列不能有多個值。
2)每個例項(行、記錄)能夠唯一的區分(主鍵)。
3)資料庫表不包含其他資料庫表中非主鍵關鍵字資訊(減少欄位冗餘)。
3.表的反正規化的優化
1)為了查詢效率把符合第三正規化的表增加適量的冗餘,達到優化查詢的目的,反正規化優化是以空間換取時間的操作(嚴格遵循第三正規化會導致很多使用臨時表的SQL操作,會增加IO操作降低查詢效率;此時通過SQL優化是達不到我們優化目的的只能修改表結構增加適量的冗餘)。
4.表的垂直拆分(把含有多個列的表拆分成多個表,解決表寬度問題)
4.1.把不常用的欄位單獨放在同一個表中
4.2.把大欄位獨立放入一個表中
4.3.把經常使用的欄位放在一起
5.表的水平拆分(為了解決資料表中資料過大的問題,水平拆分每一個表的結構都是完全一致的)
5.1.如何將資料平分到N張表中的常用方法:
1)對ID進行hash運算,如果要拆分成5個表,mod(id,5)取出0~4個值
2)針對不同的hashID將資料存入不同的表中
5.2.水平拆分帶來的問題和挑戰
1)跨分割槽表的資料查詢
2)統計及後臺報表的操作