1、字段類型設計原則
- 更小的就是更好的:更小的字段類型通常更快,以為它們占用更小的磁盤、內存、緩存使用,降低I/O開銷,而且需要的CPU處理周期更短。
- 簡單就好:簡單的數據類型需要更少的CUP周期
- 盡量避免NULL:可為NULL的列會使用更多的存儲空間,當這個字段作為索引時,每個索引記錄需要一個額外的字節。
- 不要用字符串存儲時間和數值,他們在存儲和排序上的差距較大
2、MySQL常用字段類型有:
1)數值類型:
| 字段類型 | 大小(字節) | 值范圍 |
| tinyint | 1 | (-128,127) |
| smallint | 2 | (-32768,32767) |
| mediumint | 3 | (-2^23,2^23-1) |
| int/integer | 4 | (-2^31,2^31-1) |
| bigint | 8 | (-2^63,2^63-1) |
| float | 4 | |
| double | 8 | |
| decimal(m,n) |
- 整數類型可設置寬度,如int(1)、int(11),事實上對大多數應用它是無意義的,它們的存儲是一樣,性能也是一樣,只是讓客戶端看到的信息不一樣。
- decimal(m,d)允許最多65個數字,m是最大精度,d是小數精度;CUP不支持decimal的直接計算,MySQL通過內部方式實現高精度計算,相對原生浮點類型,計算速度要慢。浮點類型(float、double)在存儲同樣范圍的值時,通常比decimal占用更少的空間,只有需要對小數進行精確計算時才使用decimal(例如財務數據)。
2)字符類型:
| 字段類型 | 大小(字符) | 說明 |
| char | 0-255 | 固定長度字符 |
| varchar | 0-65535 | 可變長字符 |
| tinyblob | ||
| blob | ||
| mediumblob | ||
| longblob | ||
| tinytext | 最多存255個字符 | |
| text | 最多存65535字符 | |
| mediumtext | ||
| longtext |
- 字符的存儲方式跟引擎相關,我們這里說明的是InnoDB引擎。
- 關於char和varchar
- varchar可變字符串,相對char更節省存儲空間(表的ROW_FORMAT=FIXEX例外,它的每一行都使用定長存儲)
- varchar需要額外的1或2個字節記錄字符串長度,當最大長度小於等於255時,使用1個字節,超過255時使用2個字節。例如varchar(10)需要11個字節存儲,varchar(1000需要1002個字節存儲。
- varchar節省存儲空間,所以對性能有幫助。但由於行是變長的,所以update時可能使行變的更長,這樣就需要額外的工作。如果一個行占用空間增長且在頁內沒有更多的存儲空間,MyISAM會將行拆成不同的片段存儲,InnoDB則需要分裂頁來使行可以放到頁內。
- 適合varchar類型的列:字符串列最大長度比平均長度大很多;列更新很少。char適合很短的或者長度接近的字符串。對於非常短的列,char存儲上更有效率。
- char和varchar存儲的是字符,使用UTF-8字符串時,每個字符占用的字節數不同。
- 關於blob和text類型
- blob存儲的是2進制,沒有排序規則和字符集,text有排序規則和字符集
- MySQL對blob和text的排序與其他類型不同,它只對每個列的最前max_sort_length字節而不是整個字符串排序。如果只需排序前面的一小部分,我們可以調整max_sort_length配置,或者使用order by sustering(column,length)
- MySQL不能將blob和text的全部字符串進行索引,也不能使用這些索引消除排序。
3)時間類型:
| 字段類型 | 大小(字節) | 值范圍 | 顯示格式 | 說明 |
| year | 1 | [1901,2155] | yyyy | |
| date | 3 | [1000-01-01,9999-12-31] | yyyy-MM-dd | 日期 |
| time | 3 | HH:mm:ss | 時間 | |
| datetime | 8 | yyyy-MM-dd HH:mm:ss | 日期和時間 | |
| timestamp | 4 | yyyy-MM-dd HH:mm:ss.SSS | 時間戳,可精確微妙,精度的位數可定義。 |
4)其他:
| 字段類型 | 說明 |
| bit | 二進制字符串,長度1-64 |
| set | 集合類型,存儲上實際是int類型 |
| enum | 枚舉類型,最多支持65535個枚舉項。枚舉類型內部使用int類型存儲 |
- 在MySQL5前,bit是tinyint的同義詞。bit的行為因存儲引擎而已,MyISAM按位進行存儲,如bit(17)有17位,它使用3個字節存儲,Memory和InboDB位每個bit列使用足夠存儲的最少整形。MySQL把bit當做字符串類型,而不是數字類型。
- 枚舉類型enum,最多有65535個枚舉項,但真使用這么多項我們的應用會非常復雜。枚舉適合少量枚舉且相對固定的數據。
- MySQL沒有bool(常用tinyint(1)或bit(1)表示布爾類型)、long類型
