數據類型的選擇原則性能
MySQL支持別名,但它不會影響性能。優化
分爲整型和實數。若是儲存整數。可使用:tinyint、smallint、mediumint、int、bigint,分別使用8,16,24,32,64位存儲空間,儲存的值的範圍從-2^(N-1)到2^(N-1)-1,其中N是存儲空間的位數。spa
整型類型有可選的unsigned屬性,表示不容許負號,這大體可使正數的上限提升一倍。同時有符號和無符號類型(表示正負數)使用相同的儲存空間,並具備相同的性能。設計
實數是帶有小數部分的數字。也可使用decimal存儲比bigint還大的整數。code
浮點(float、double)和decimal類型均可以指定精度。浮點類型在存儲一樣範圍的值時,一般比decimal使用更少的空間。由於須要額外的空間和計算開銷,應該只在對小數進行精確計算時才使用decimal——例如存儲財務數據。blog
varchar和char類型,下面的描述假設使用的存儲引擎是InnoDB/MyISAM。排序
最好的策略是隻分配真正須要的空間。索引
Blob和text都是爲了存儲很大的數據而設計的字符串數據類型,分別採用二進制和字符方式存儲。ci
使用場景:
枚舉列能夠把一些不重複的字符串存儲成一個預約義的集合而且除非能接受只在列表末尾添加元素,由於字符串列表是固定的,對於一系列將來可能會改變的字符串,使用枚舉不是一個好主意。字符串
優勢:
enum關聯enum後,關聯查詢變得更快。當varchar列和enum列進行關聯時則慢不少。
把varchar列轉換爲enum可讓表的大小縮小,能夠根據show table status命令輸出結果中data_length列的值。
bit列,列在一列中存儲一個或多個true/false值。對於大部分應用,最好避免使用這種類型,另外一個方法是建立一個char(1),用來存儲0/1。
set列,若是須要保存不少true/false值,能夠考慮合併這些列到一個set數據類型,它在MySQL內部是以一些列打包的位的集合來表示的。建議set列中的狀況會同時出現時使用。
這樣有效地利用了存儲空間。一個包裝位的應用的例子是保存權限的訪問控制列表(ACL)。
CREATE TABLE acl( perms SET('can_read','can_wrtie','can_delete') NOT NULL ); INSERT INTO acl(perms) VALUES('can_read,can_delete'); SELECT perms FROM acl WHERE FIND_IN_SET('can_delete',perms);--查詢字段perms中包含can_delete的結果,返回結果爲null或記錄
結果: