1. 程式人生 > >Schemal和數據類型的優化

Schemal和數據類型的優化

周期 最好 提高 基本數據 null 占用 計算 位數 double類型

一、選擇優化的數據類型

1.盡量更小

更小的數據類型會占用更小的磁盤、內存和CPU,並且處理時需要的CPU周期也更少。

2.簡單的數據類型通常需要更小的CPU周期

列如:整型比字符操作代價更低,因為字符集和校對規則使得字符比較比整型更加復雜。

3.盡量避免NULL

很多表都包含NULL列,即使應用程序並不需要保存NULL也是如此,這是因為NULL值是列的默認屬性。通常情況下面最好指定列為NOT NULL,除非真的需要存儲NULL值。

由於可為NULL的列使得索引、索引統計和值比較都比較復雜。可為NULL的列需要更多的存儲空間,需要特殊的處理。當可為NULL的列添加索引的時候,每一個索引記錄需要一個額外的字節。但是由於把NULL值改為NOT NULL值得所帶來的提升比較小,所以調優的時候沒有必要改掉這個情況,除非他引起了問題。

二、基本數據類型

1.1).整數類型

有兩種類型的數字:整數和實數

如果存儲整數:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。分別使用8,16,24,32,64位存儲空間。他們的存儲範圍可以從-2(N-1)到2(N-1)-1 其中N是位數。整數類型有可選的UNSIGNED 屬性 表示不允許負值,這大致可以是正數的上限提高一倍。列如:TINYINT UNSIGNED 的存儲範圍是 0-255 而TINYINY的存儲範圍是 -128~127。

MYSQL可以為整數類型指定寬度,列如:INT(11),對於大多數應用這個是沒有意義的,它不會限制值得合法範圍,知識規定了MYSQL的一些交互工具用來顯示字符的個數,對於存儲和計算來說,沒有任何意義。

2).實數類型

實數是帶有小數部門的數字。然而實數類型不僅可以存儲實數類型也可以使用DECIAML存儲比BIGINT更大的整數。MYSQL同時支持精確和不精確的類型。因為CPU不支持對DECIMAL的直接計算,所以在MYSQL5.0或者更高的版本的中,MYSQL服務器自身實現了對DECIAML更加精準的計算。相對而言,CPU直接支持原生浮點數計算,所以浮點運算明顯更快。然而在早期的MYSQL版本中 DECIAML只是一個存儲格式,在進行計算的時候,DECIMAL會轉換為DOUBLE類型。因為DECIMAL需要額外的空間和計算開銷,所以盡量只是對小數進行精確計算的時候,才進行使用 例如:存儲財務數據。

2.字符串類型

01).varchar和char類型是最主要的字符串類型。存儲引擎存儲CHAR或者VARCHAR值得方式在內存中和磁盤中是不一樣的,所以MYSQL服務器從存儲引擎讀出的值可能需要轉換為另一種存儲格式。

VARCHAR

varchar類型用於存儲可變長度的字符串。由於它僅僅使用必要的空間,所以它比長類型更節省空間。有一種情況列外,如果MYSQL表使用ROW_FORMAT=FIXED創建的話,每一行都會使用定長存儲,這個會很浪費空間。varchar需要使用1或者2個額外的字節記錄字符串的長度,如果列的最大長度小於255個字節,則使用1一個字節保存長度,否則使用2個字節保存長度。例如 varchar(10)需要1個字節保存長度,varchar(1000)需要2個字節保存長度。在5.0或者更高版本的時候會保存末尾空格,在早期的版本中的時候,會剔除末尾空格。

CHAR

char類型的長度是定長的:MYSQL總是根據定義的字符串長度分配足夠的空間,當存儲CHAR值得時候,MYSQL會剔除末尾空格。

BINARY和VARBINARY

他們存儲的是二進制字符串,二進制字符串和常規字符串非常相似,但是二進制字符串存的是字節碼而不是字符,填充也不一樣:MYSQL在填充的時候填充的是\0(零字節)而不是空格,在檢索的時候也會去掉填充值。

BLOB和TEXT類型

該兩個類型都是為了存儲很大的數據而設計的字符串類型的數據類型,分別采用二進制和字符方式進行存儲。實際上TEXT的家族包括:TINYTEXT,SMALLTEXT,TEXT,MEDIUMTEXT,LONGTEXT;對應的BLOB的家族類型是:TINYBLOB,SMALLBLOB,BLOB,MEDIUMBLOB,LONGBLOB。BLOB是SMALLBLO的同義詞,TEXT是SMALLTEXTd的同義詞。BLOB存儲的是二進制數據,沒有排序規則和字符集,而TEXT則正好相反。

ENUM(使用枚舉類型來代替字符串類型)

Schemal和數據類型的優化