mysql數(shù)據(jù)類型
1.數(shù)據(jù)類型的長(zhǎng)度盡量小:在滿足要求的前提下數(shù)據(jù)類型長(zhǎng)度越小,需要的存儲(chǔ)空間也就越小,同時(shí)需要讀取的CPU周期可能也會(huì)越少,可以提高性能
2.數(shù)據(jù)類型盡量簡(jiǎn)單:因?yàn)楫?dāng)數(shù)據(jù)類型比較簡(jiǎn)單的時(shí)候說(shuō)明其規(guī)則也比較簡(jiǎn)單,這樣帶來(lái)的操作代價(jià)也就會(huì)越小
3.盡量避免NULL:
原因:a:NULL可能會(huì)需要額外的存儲(chǔ)空間?
?????????? b.存在NULL的列會(huì)使得MySql更難優(yōu)化,因?yàn)榇嬖贜ULL的列當(dāng)做索引的時(shí)候,可能會(huì)使得索引的值比較和索引統(tǒng)計(jì)都比較困難
?????????? c:當(dāng)可為NULL的列被索引時(shí),每一個(gè)索引記錄會(huì)需要一個(gè)額外的字節(jié)。
數(shù)據(jù)類型簡(jiǎn)介:
整型: 主要有 tinyint ? smallint ?mediumint ? int ?bigint ? 這5種數(shù)據(jù)類型,他們的數(shù)據(jù)類型的長(zhǎng)度是固定的。分別是8bit ? 16bit ? 24bit ? 32bit ? 64bit 這樣可以得到存儲(chǔ)空間的大小 ?int(11),表示的展示長(zhǎng)度,如果指定了 ?zerofill ? 那么就會(huì)顯示11位 (00000000001)
實(shí)數(shù)類型:Decimal ?用于存儲(chǔ)精確的小數(shù)??梢灾付ㄐ?shù)點(diǎn)前后允許的最大位數(shù)DECIMAL(18,9)小數(shù)點(diǎn)前后各有9個(gè)數(shù)字。每4個(gè)字節(jié)存儲(chǔ)9個(gè)數(shù)字。一共需要9個(gè)字節(jié),前后各4個(gè)字節(jié),小數(shù)點(diǎn)一個(gè)字節(jié)。
float和double在計(jì)算的時(shí)候會(huì)使用浮點(diǎn)運(yùn)算,可能導(dǎo)致一些奇怪的結(jié)果。但是decimal會(huì)需要更大的空間和計(jì)算開(kāi)銷,所以應(yīng)該盡量在對(duì)小數(shù)需要精確計(jì)算的時(shí)候使用decimal
字符串類型:CHAR 和VARCHAR:一個(gè)是定長(zhǎng)字符串,一個(gè)是不定長(zhǎng)字符串,CAHR會(huì)為每一個(gè)記錄創(chuàng)建固定大小的存儲(chǔ)空間,而VARCHAR則是需要多少分配多少,但是會(huì)需要額外的空間記錄當(dāng)前占用空間的多少,所以,VARCHAR(200),記錄“a”時(shí),需要兩個(gè)字節(jié),一個(gè)字節(jié)記錄大小,而VARCAHR(2000)的列自會(huì)需要額外兩個(gè)字節(jié), 因?yàn)?000超過(guò)了255,VARCHAR是比較節(jié)省空間,但是當(dāng)有UPDATE
操作的時(shí)候可能產(chǎn)生碎片,而CHAR則不需要考慮這個(gè)問(wèn)題, CHAR 會(huì)將字符串末尾的空格截?cái)?,?duì)于超長(zhǎng)的字符串InooDb會(huì)將VARCHAR轉(zhuǎn)為BLOB ? 更長(zhǎng)的列會(huì)使用更大的內(nèi)存,而mysql一般會(huì)分配固定內(nèi)存,如果長(zhǎng)度較長(zhǎng)的時(shí)候,在內(nèi)存中進(jìn)行臨時(shí)表排序的時(shí)候性能會(huì)有影響,所以需要多少,要求多少才是最佳選擇
? ? ? ? ? ? ? ? ? ? ? ?
?BLOB 和TEXT:是為存儲(chǔ)很大數(shù)據(jù)類型而設(shè)計(jì)的,兩者的不同僅在于存儲(chǔ)類型的不同,前者是二進(jìn)制,后者是字符串,如果值過(guò)大,那么mysql會(huì)使用外部存儲(chǔ),行內(nèi)存儲(chǔ)的是指針,指向外部存儲(chǔ)的內(nèi)容? ? ? 同時(shí)這兩個(gè)類型的排序方式也是不一樣的,他會(huì)指定max_sort_length,只進(jìn)行比較前n個(gè)字符,而不是全部,以期獲得比較好的性能
?
ENUM類型:直說(shuō)一句,在存儲(chǔ)的時(shí)候ENUM類型存儲(chǔ)的并不是我們指定的字符串,而是數(shù)字,這是mysql為了壓縮空間使用的方法,而在讀取時(shí)是根據(jù).frm文件進(jìn)行的轉(zhuǎn)換,也就是在表定義中存儲(chǔ)的映射關(guān)系