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