第四章—資料庫與資料優化
阿新 • • 發佈:2020-12-30
選擇優化的資料型別
- 更小的通常更好
- 一般情況下,應該使用正確儲存資料的最小型別
- 因為佔用的記憶體、磁碟、cpu資源更少
- 簡單就好
- 簡單的資料型別需要的CPU週期更少,例如操作整型比操作字元代價更低
- 儘量避免
NULL
,如果不是特別的需要null值,一般設為不為空,因為mysql對null的索引比較複雜 - datetime和timestamp都可以儲存時間,精確到秒。但是timestamp只是用datetime的一半儲存空間,而且會根據時區變化,具有特殊的自動更新能力
整數型別
- tinyint(8位)
- smallint(16位)
- mediumint(24位)
- int(32位)
- bigint(64位)
- 資料範圍```-2^(N-1)~2^(N-1)
- 整數計算一般使用bigint
- 對於儲存和計算來說int(1)和int(20)沒有區別
實數型別
- 實數是帶有小數部分的數字
- float、double(可以指定資料寬度:double(18,9)表示資料一共18位,小數點後面保留9位),但是要避免指定資料精度,mysql已經拋棄了指定浮點數精度與整數顯示寬度的特性,雖然還可以繼續使用,但是最好不要使用mysql拋棄的這些特性。
- decimal支援精確計算,可以儲存比bigint還大的資料。但是cpu不支援decimal的計算(由演算法解決),cpu原生支援浮點運算
字串型別
varchar
- 用於儲存變長的字元
- 會額外使用1或2個空間記錄字串的長度
- 字元長度大於255個時,使用2個空間記錄,否則使用1個
char
- 儲存定長的字元
- char格式會刪除字元後面的空格,但前面的不會,例如輸入ABC__,但是隻會輸出ABC。但是varchar會保留原有格式
- 對於定長的資料,無論它是固定的還是會變化的,只要長度固定就使用char,例如MD5加密後額密碼,定長的char不容易產生碎片
- 儲存
Y
這個字母,char需要1個空間,varchar需要2個
binary和varbinary
- 用來儲存二進位制字串
- 二進位制字串儲存的是位元組碼不是字元
注意
- 若儲存
HELLO
,使用varchar(6)比使用varchar(200)更好。 - 最好的策略是隻分配真正需要的空間
混合使用正規化與反正規化
- 正規化的優點:操作速度更快、減少資料重複、表佔用空間小、資料冗餘小
- 正規化的缺點:常常需要關聯
- 反正規化的優點:避免關聯
- 反正規化的缺點:最差的時候要全表掃描