Schema與資料型別優化

2022-04-12 22:06:38 字數 1773 閱讀 7275

schema:是資料庫物件的集合(比如使用者建立了表,索引,檢視,儲存過程等物件,那麼這些物件就構成了schema)

應根據系統將要執行的查詢語句來設計schema,往往需要權衡各種因素。

反正規化的設計可以加快某些型別的查詢(同時可能使另一些型別的查詢變慢)

新增計數表和彙總表可以優化查詢(這些表的維護成本可能會很高)

選擇資料型別的原則:

1.小的好 :在可以正確儲存資料的前提下,越小越好(比如能用tinyint就不用int,因為小的占用更少磁碟,記憶體和cpu快取,處理時需要的cpu週期也更少)

2.簡單好 :整型比字元型操作代價更低,使用mysql內建型別(datetime和timesamp)而不是字串儲存時間日期,用整型儲存ip(timesamp只使用datetime一半的儲存空間,並且會根據時區變化,能自動更新,前者允許的時間範圍小得多,有時這些特殊能力會成為障礙)

3.避免null:若查詢中包含可為null的列更難優化,因為該列使得索引,索引統計和值比較都更複雜,會使用更多儲存空間,並且需要特殊處理。當可為null的列被索引時,每個索引記錄需要乙個額外位元組【在myisam裡甚至還可能導致固定大小的索引變成可變大小的索引】

(通常把可為null的列改為not null帶來的效能提公升比較小,所以沒有必要首先處理這種情況,除非確定會導致問題。若計畫在列上建索引,就應盡量避免設計成可為null的列)

【innodb使用單獨的位(bit)儲存null,所以對於稀疏資料(很多值為null,只有少數列為非null值)有很好的空間效率。但這點不適用於myisam】

各種資料型別的注意點:

1.整數型別:

(1)有無符號型別使用相同的儲存空間,並具有相同效能。

(2)mysql可以為整數型別指定寬度,例如int(11),不過該寬度只是規定了mysql一些互動工具(例如mysql命令列客戶端)的顯示字元數,對於儲存和計算來說int(1)和int(20)並無不同

2.實數型別:

實數是帶有小數部分的數字。但並不只是為了儲存小數部分,也可用decimal儲存比bigint還大的整數

(1)float 和 double 支援浮點運算進行近似計算。

(2)decimal 用於儲存精確的小數。可以指定小數點前後所允許位數(會影響空間消耗)

【mysql5.0和更高版本支援精確計算,由於cpu不支援對decimal的精確計算,mysql伺服器自身實現了decimal的高精度計算。(cpu支援原生浮點計算,所以浮點運算明顯更快)】

【浮點型別在儲存同樣範圍的值時,通常比decimal使用更少空間。mysql使用 double 作為內部浮點計算型別】

建議:(1)只在需要對小數進行精確計算時使用 decimal, 避免額外空間和計算開銷;

(2)在資料量比較大時,用bigint代替decimal,在訪問時乘相應倍數即可

3.字串型別:

下面描述假設儲存引擎是innodb / myisam:

(1)varchar和char:

適合使用varchra:

1. 字串列的最大長度比平均長度大很多

2. 列的更新很少

3. 使用類似utf-8的字符集,每個字元都使用不同位元組儲存

注:varchar(200)和varchar(5)儲存'hello'開銷是相同的,但是會耗更多記憶體(mysql會分配固定大小的記憶體塊儲存內部值,這樣當使用記憶體臨時表或利用磁碟臨時表排序時會很糟糕)

適合使用char:

1. 很短的字串(非常短的列char比varchar儲存空間有優勢,因為varchar儲存長度還需要位元組)

2. 同列所有值長度相近

3. 經常變更的資料

Schema與資料型別優化

關於資料型別選擇的一些記錄 tinyint 8 smallint 16 mediumint 24 int 32 bigint 64 可選屬性 unsigned。mysql可以為整型指定寬度,如int 11 但大多數時候沒有意義,只是規定了一些互動工具用來顯示字元的個數。從mysql4.1開始,每個字...

Schema與資料型別優化

選擇優化的資料型別 1.更小的通常更好 一般情況下,應該盡量使用可以正確儲存資料的最小資料型別。因為它們占用更少的磁碟。記憶體和cpu快取,並且處理時需要的cpu週期也更少 2.簡單就好 簡單資料型別的操作通常需要更少的cpu週期 3.盡量避免null 通常情況下最好指定列為not null。通常把...

Schema與資料型別優化

關於整數型別 1.整數型別都有可選的unsigned,表示不允許負值。2.為整數型別指定顯示寬度是沒有意義的,只會控制客戶端顯示字元的個數。關於實數型別 1.不精確型別 float,double 精確型別 decimal 2.cpu不支援對decimal進行直接運算,可以直接對浮點進行運算 同時,d...