1. 程式人生 > >讀高效能Mysql---4--Schema與資料型別優化 有感

讀高效能Mysql---4--Schema與資料型別優化 有感

Schema與資料型別優化

 

選擇優化的資料型別

 

1.更小的通常更好

       佔用更少磁碟,記憶體和CPU快取,處理的CPU週期也更少

2.簡單就好

       減少CPU操作週期,整型比子夫操作代價更低,

3.儘量避免null

     null值對sql更難優化,null的列使得索引,索引統計和值得比較更為複雜,且null會使用更多儲存空間;

     為null的列被索引,每個索引記錄需要額外的位元組。

     通常把null列改為not null帶來新能提升較小,所以調優時沒必要首先定位這種問題,除非確定這會導致問題。但是計劃

     在列上建立索引,儘量避免設計null的列。

     當然也有列外,Innnodb使用單位的為(bit)儲存null值,所以對於稀疏資料(很多為null,少數列有值)有很好的空間效率

    不適用於mMyIsam

   

     列如:TIMESTAMP只使用DATETIME一般的儲存空間,根據時區變化,具有自動更新能力。TIMESTAMP允許的時間範圍        更小,也是他的障礙。

 

1:整數型別


  mysql支援一下幾種型別整數:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分別8,16,24,32,64為儲存空間,範圍-2(N-1)-2(N-1)-1,其中N是儲存空間的位數。
   整數還有UNSINGED屬性,表示不允許負值,可以使正數的上限提高一倍,但是儲存空間一樣,效能一樣。
   整數計算一般使用64位BIGINT整數,所以在程式碼中接收類似count(id)的結果時,要定義成BigInteger,不然會報錯,
   對於儲存和計算來說,INT(1)和INT(20)是一樣的。

mysql可以為整數型別指定寬度,列如int(11),沒有意義,他不會限制值得合法範圍,只是用來顯示值得字元個數。

 

2:實數型別


   實體是帶有小數部分的數字。  float double 我們不僅可以用與儲存小數部分,還可以使用DECIMAL(精確計算)儲存比BIGINT(能表示20位,18..)還大的整數。之前看到公司老系統中使用DECIMAL來表示數字型別一直不明白,可能存在這個原因。
     在需要對小數進行精確計算時 如財務資料,才使用DECIMAL來表示(mysql5.0以上)

 

3:字串型別


  varchar和char在不同的儲存引擎中儲存方式不一樣。

   varchar
   varchar型別用於儲存可變長字串,比定長型別更節省空間,它僅使用必要的空間,如varchar(20) "abc" 僅使用3個位元組,但是它會再拿出1或2個位元組來記錄字串長度(大於255位元組為2個),儲存時會保留末尾空格,對於varchar來說最好的策略是隻分配真正需要的空間。

   使用情況:如果字串列的最大長度比平均長度大很多;列的更新很少,所以碎片不是問題;使用了UTF-8這樣的複雜字符集。

    Char
    char 型別是定長,會刪除所有的末尾空格,會根據需要採用空格進行填充以方便比較。

              使用情況:適合儲存很短的字串,或者所有值都接近一個長度,比如char 非常適合儲存密碼的MD5值,因為他是一個定長。我們可以使用char(1) 來儲存只有Y和N的值,它只需要一個位元組,而如果使用varchar(1)會佔用兩個位元組。對於經常改變的資料,char也更好。