1. 程式人生 > 實用技巧 >第四章—資料庫與資料優化

第四章—資料庫與資料優化

選擇優化的資料型別

  • 更小的通常更好
    • 一般情況下,應該使用正確儲存資料的最小型別
    • 因為佔用的記憶體、磁碟、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)更好。
  • 最好的策略是隻分配真正需要的空間

混合使用正規化與反正規化

  • 正規化的優點:操作速度更快、減少資料重複、表佔用空間小、資料冗餘小
  • 正規化的缺點:常常需要關聯
  • 反正規化的優點:避免關聯
  • 反正規化的缺點:最差的時候要全表掃描