a.選擇數據類型的簡單原則
1.更小一般更好:要試着使用能正確存儲和表示數據的最小類型.更小的數據類型一般更快,由於它們使用了更小的磁盤空間、內存和CPU緩存,並且須要的CPU週期也更少.
2.簡單就好:越簡單的數據類型須要的CPU週期越少.例如,比較整數的代價小於比較字符串,由於字符集和排序是字符串比較更復雜.應該使用MySQL內建的類型來保存日期和時間,而不是字符串,應該使用整數來表示IP而不是字符串.
3.儘可能避免NULL:要儘量的把例定義爲NOT NULL,由於MySQL難以優化使用了可空例的查詢,它會使索引、索引統計和值更加複雜.可空例須要更多的存儲空間,還須要在MySQL內部進行特殊處理.當可控例被索引的時候,每條記錄都須要一個額外的字節,還能致使MyISAM中固定大小的索引變成可變大小的索引.即便要在表中存儲"沒有值"的字段,能夠考慮0或者空字符串來代替.若是計劃對列進行索引,就要儘可能避免把它設置成可空.
b.MySQL數據類型
1.數字類型
數字有2種類型:整數和實數
a.整數:整數能夠使用TINYINT、SMALLINT、MEDIUMIN、INT、BIGINT,分別須要8,16,24,32,61位存儲空間.它們的範圍爲-2(N-1次方)到2(N-1次方)+1,N即前面所說的存儲空間.同時,整數類型還有可選的UNSIGNED屬性,它表示不容許負數,同時把正上限提升了一倍.UNSIGNED和SIGNED類型佔用的存儲空間和性能都是同樣的.MySQL還能夠爲整數類型定義寬度,這對於大多數應用是沒有意義的,它不會限制值的範圍,值規定了MySQL的交互工具(如:MySQL客戶端)用來顯示字符的個數,對於存儲和計算INT(1)和INT(20)是同樣的.
b.實數:實數有分數部分,能夠使用DECIMAL保存比BIGINT還大的整數,MySQL同時支持精確和非精確類型.
FLOAT和DOUBLE類型支持使用標準的浮點運算進行近似計算,浮點數的具體運算和平臺有關.
2.字符串類型
a.VARCHAR和CHAR類型:這兩種類型保存到內存或磁盤的具體實現依賴於存儲引擎,以InnoDB或MyISAM爲例:VARCHAR保存了可變長度的字符串,是使用最多的字符串類型,它比固定長度的字符串佔用更少的存儲空間(注:使用ROW_FORMAT=FIXED建立的MyISAM表,它爲沒行使用固定長度的空間,可能形成資源浪費),它使用額外的1到2字節來保存值的長度,若是列的最多長度小於或等於255則使用1字節,不然就使用兩字節.CHAR的長度是固定的,MySQL總會爲特定數量的字符分配足夠的空間,當保存CHAR值的時候,MySQL會去掉末尾的空間.
CHAR(1)和VARCHAR(1)中的1表明的是字符而不是字節.
3.BLOB和TEXT
BLOB和TEXT分別以二進制和字符形式保存大量數據
字符類型有:TINYTEST、SMALLTEXT、TEXT、MEDIUMTEST、LONGTEXT,二進制類型有:TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB.BLOB等同於SMALLBLOB,TEXT等他於SMALLTEST.BLOB和TEXT的惟一區別是BLOB保存的是二進制數據沒有字符集和排序規則,可是TEXT有字符集和排序規則.MySQL對BLOB和TEXT列的排序方式和其餘類型不一樣,它不會按照字符串的完整長度進行排序,而是按照max_sort_length規定的前若干個字節進行排序,若是隻按照開始的幾個字符排序,就能夠減小max_sort_length的值或者使用ORDER BY SUBSTRING(column,length).
4.ENUM
有時能夠用ENUM來代替傳統的字符串類型,ENUM列能夠存儲65535個不一樣的字符串,MySQL以很是緊湊的方式保存它們,根據列表中值的數量,MySQL會將它們壓縮到1到2個字節.MySQL在內部把它們每一個值都保存爲整數,以表示值在列表中的位置,而且還保留一份"查找表"來表示整數和字符串在表.frm文件中的映射關係.注:ENUM排序是按照數字順序進行排序的而不是字符串.
5.日期和時間類型
a.DATETIME,這個類型能保存大範圍的的值,從1001到9999,精度爲秒,它把日期和時間封裝在一個格式爲YYYYMMDDHHMMSS的整數中,與時區無關,它使用了8字節存儲空間
b.TIIMSTAMP,保存了自1970年1月1日午夜以來的秒數,TIMESTAMP只使用了4字節的空間,所以它只能表示1970到2038年,與時區有關.
c.選擇標識符
爲標識符列選擇合適的數據類型是很是重要的.整數一般是標識符的最好選擇,由於它速度快而且能使用AUTO_INCREMENT,要儘可能避免使用字符串作標識符,由於它佔用了不少空間而且比整數要慢.特別注意不要在MyISAM表 上使用字符串標識符,由於MyISAM默認爲字符串使用了壓縮索引,這使查詢更慢.緩存