MySQL數據庫的數據類型非常多,選擇正確的數據類型對於獲得高性能至關重要。數據的存儲和存儲引擎有關,不同的存儲引擎存儲相同類型的數據時可能方式不一樣。
一般把握以下幾點:
更小的通常更好
一般情況下,應該儘可能使用正確存儲數據的最小數據類型。更小的數據類型通常更快。
簡單就好
簡單的數據類型的操作通常需要更少的CPU週期。
儘量避免使用null,通常情況下最好指定列爲NOT NULL。
可爲null的列使得索引、索引統計和值比較都更復雜。
可爲null的列會使用更多的存儲空間,在MySQL裏面做特殊處理。
數據類型分析
整數
MySQL提供了幾種整數類型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。分別使用8、16、24、32、64位存儲空間。
整數類型有可選的UNSIGNED屬性,表示不允許負值(這樣可以擴大正數的範圍)。
對於存儲和計算來說INT(11) 和INT(20)是相同的,只是規定了MySQL的一些交互工具用來顯示的字符的個數。
實數
MySQL提供了幾種實數類型:FLOAT、DOUBLE、DECIMAL。FLOAT、DOUBLE分別使用32、64位存儲空間。DECIMAL在MySQL 5.0和更高版本中允許最多65個數字。
DECIMAL可以存放比BIGINT更大的數字,一般儘量在對小鼠進行精確運算時才使用。
字符串類型
MySQL提供了幾種字符串類型:VARCHAR、CHAR。VARCHAR用來存儲可變長度的字符串。
VARCHAR比定長字符串更節省空間,因爲它僅使用必要的空間,所以對性能也有幫助。但在update時需要比原來更長,這就導致額外的工作。
VARCHAR最適合字符串列的最大長度比平均長度大很多,列的更新很少。
CHAR類型是定長的。MySQL在哪個是根據定義的字符串長度分配足夠的空間。
存儲char值是,MySQL會刪除所有的末尾空格。
char適合存放很短的字符串,所有的長度都接近一個長度的數據,如MD5值。
慷慨是不明智的。VARCHAR(5)和VARCHAR(200)存儲‘hello’的空間開銷是一樣的。但是更長的列會消耗更多的內存。
BOLB和TEXT類型
BOLB和TEXT都是爲存放大數據而設計的字符串數據類型。分別採用二進制和字符方式存儲。
字符類型是:TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT、LONGTEXT,對應的二進制類型是:TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB。BLOB是SMALLBLOB的同義詞、TEXT是SMALLTEXT的同義詞。
使用枚舉代替字符串類型
有時候可以用枚舉列代替常用的字符串類型。沒劇烈可以把一些不重複字符串存儲成一個預定義的集合。
日期和時間類型
DATETIME存放的時ANSI標準定義的日期和時間表示方法,精確到秒。
TIMSTAMP保存了從1970年1月1日午夜以來的秒數,它和UNIX時間戳相同。
除了特殊行爲之外,通常也應該儘量使用TIMESTAMP,因爲它比DATETIME空間效率更高。