字段選擇的基本規(guī)則
- 更小的通常更好甜奄,同類型字段吆寨,盡量選擇占用更小的存儲空間的,更小的字段通常速度更快拧廊,因為占用更少的硬盤空間监徘,內(nèi)存空間和cpu資源。 若tinyint 滿足條件 則不選擇int
- 簡單更好吧碾,多個數(shù)據(jù)類型滿足的情況下凰盔,選擇更簡單的類型。更簡單的類型可以減少cpu的處理時間倦春。 如數(shù)字型會比字符串更加有優(yōu)勢
- 盡量避免null户敬, 如果字段中允許null的話,mysql很難去優(yōu)化查詢溅漾,因為所建立的索引會更加復(fù)雜
整數(shù)型
整數(shù)型包含了 tinyint山叮、smallint、mediumint添履、int 和 bigint屁倔,分別是2的8、16暮胧、24锐借、32、64位存儲空間
signed 和unsigned 使用相同的空間往衷,
int(1)和int(20)是占用一樣的空間钞翔,并且作用是一樣的。只是會在一些mysql的交互工具上顯示不同而已席舍。
實數(shù)類型
實數(shù)型包含float布轿、double、decimal来颤,decimal可以用來存儲bigint存儲不下的數(shù)字
float和double只能提供近似的值汰扭,如要存儲精確的小數(shù)則需要使用decimal來處理
因為decimal占用的空間較大,如數(shù)字大小并不大福铅,則可以使用將小數(shù)部分乘以百萬 轉(zhuǎn)為bigint存儲
字符串類型
varchar
varchar是變長字符串萝毛,使用1到2位來存儲長度,當(dāng)字符串長度不大于255時使用1位
varchar對性能的提升是因為它是變長的滑黔,但當(dāng)你更新它時需要進(jìn)行額外的工作
對于varchar 盡量使用符合條件 更短的長度笆包。 長度大時环揽,mysql需要消耗更多的內(nèi)存去處理,mysql在內(nèi)部處理時庵佣,總是將varchar轉(zhuǎn)為定長字符串歉胶。尤其在filesort,臨時表和排序時秧了,對性能影響更大
使用場景
- 當(dāng)字符串的最大長度遠(yuǎn)大于字符串的平均長度
- 字段的更新很少跨扮,頻繁的更新會導(dǎo)致頁分裂
- 使用復(fù)雜的字符集
char
char是定長字符串
使用場景
- 當(dāng)你存儲很短的字符串時,char是非常好用的验毡,例如存儲md5后的值
- 存儲的值經(jīng)常需要更新
char會自動將字符串結(jié)尾的空格去掉衡创,而varchar則不會
text 和 blob
text和blob可以存儲大量的字符串和數(shù)字,text具有字符集而blob不具有字符集
text有 tinytext晶通、text璃氢、mediumtext和longtext
blob有tinyblob、smallblob狮辽、blob一也、mediumblob和longblob
時間類型
datetime類型
yyyy-mm-dd hh:mm:ss
datetime 類型時間和時區(qū)無關(guān) 占用8個字節(jié)存儲空間
timestamp 實際上是以int 1970年-2038年
存儲1970年1月1日到當(dāng)前時間的秒數(shù),以yyyy-mm-dd hh:mm:ss顯示喉脖,占用4個字節(jié)
顯示依賴于指定時區(qū)
在行修改時椰苟,可以自動修改timestamp值
date類型 只用3個字節(jié)
只存儲日期,可以利用日期時間函數(shù)進(jìn)行計算
time類型
只存儲時間數(shù)據(jù)树叽,hh:mm:ss
不要使用字符串來存儲時間日期