mysql資料型別:數值、日期/時間、字串(字元)型別、復合型別。
一般情況下選擇可以正確儲存資料的最小資料型別。越小的資料型別通常更快,占用磁碟,記憶體和cpu快取更小,大大減少io開銷。
簡單的資料型別的操作通常需要更少的cpu週期。例如:整型比字元操作代價要小得多,因為字符集和校對規則(排序規則)使字元比整型比較更加複雜。比如應該使用mysql內建的型別而不是使用字元型來儲存日期和時間。
盡量制定列為not null,除非真的需要null型別的值。因為可能為null列使得索引,索引統計和值比較都更複雜。可為null的列會使用更多的儲存空間,在mysql裡也需要特殊處理。當可為null列做索引時,每個索引需要乙個額外的位元組,在myisam更有可能導致固定大小的索引變成可變大小索引,在innodb中使用單獨的位(bit)儲存null值。
所以當乙個資料型別可以有多種選擇多種型別的時候,應該優先考慮數字型別,其次是日期或二進位制型別,最後應該是字元型別。盡量使用int而非bigint,如果非負則加上unsigned(這樣數值容量會擴大一倍),當然能使用tinyint、smallint、medium_int更好。使用列舉或整數代替字串型別。盡量使用timestamp而非datetime。使用列舉或整數代替字串型別。用整型來存ip。對於長度相對固定的字段使用char而不是varchar(例如,手機號,md5,身份證號碼)。對於相同級別的資料型別,應該優先選擇占用空間小的資料型別。
原理:在對資料進行比較(查詢條件,join條件及排序)操作時:同樣的資料,字元處理往往比數字處理慢,而且在資料庫中,資料的處理是以頁為單位,列的長度越小,資料型別占用的空間越小,利於效能的提公升。
型別大小範圍(有符號)範圍(無符號)用途
tinyint
1 位元組
(-128,127)
(0,255)
小整數值
smallint
2 位元組
(-32 768,32 767)
(0,65 535)
大整數值
mediumint
3 位元組
(-8 388 608,8 388 607)
(0,16 777 215)
大整數值
int或integer
4 位元組
(-2 147 483 648,2 147 483 647)
(0,4 294 967 295)
大整數值
bigint
8 位元組
(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)
(0,18 446 744 073 709 551 615)
極大整數值
float
4 位元組
(-3.402 823 466 e+38,-1.175 494 351 e-38),0,(1.175 494 351 e-38,3.402 823 466 351 e+38)
0,(1.175 494 351 e-38,3.402 823 466 e+38)
單精度浮點數值
double
8 位元組
(-1.797 693 134 862 315 7 e+308,-2.225 073 858 507 201 4 e-308),0,(2.225 073 858 507 201 4 e-308,1.797 693 134 862 315 7 e+308)
0,(2.225 073 858 507 201 4 e-308,1.797 693 134 862 315 7 e+308)
雙精度浮點數值
decimal(m,d)
m位元組(d+2 , 如果m < d)
依賴與m,d
依賴與m,d
小數值(準確精確度)
型別大小
用途char
0-255位元組
定長字串
varchar
0-65535 位元組
變長字串
tinyblob
0-255位元組
不超過 255 個字元的二進位制字串
tinytext
0-255位元組
短文本字串
blob
0-65 535位元組
二進位制形式的長文字資料
text
0-65 535位元組
長文字資料
mediumblob
0-16 777 215位元組
二進位制形式的中等長度文字資料
mediumtext
0-16 777 215位元組
中等長度文字資料
longblob
0-4 294 967 295位元組
二進位制形式的極大文字資料
longtext
0-4 294 967 295位元組
極大文字資料
mysql支援多種字串型別,每個字串列可以定義自己的字符集和排序規則,或者說校對規則,這些東西很大程度上影響效能。
1.varchar可指定n,text不能指定,內部儲存varchar是存入的實際字元數+1個位元組(n<=255)或2個位元組(n>255),text是實際字元數+2個位元組。
2.text型別不能有預設值。
3.varchar可直接建立索引,text建立索引要指定前多少個字元。varchar查詢速度快於text,在都建立索引的情況下,text的索引似乎不起作用。
使用列舉代替字串型別,列舉可以把一些重複的字串儲存成乙個預定義的集合,mysql在儲存列舉時非常緊湊,mysql在列中儲存值為列舉中的位置整數。列舉最不好的是字串是固定的,新增或刪除必須使用alter table。因此對於未來會改變的字串,使用列舉不是乙個好主意,除非能接受在列舉末尾新增元素,由於列舉有乙個對映轉換過程,所以列舉雖然能減少儲存空間,但是也會增加一些額外開銷。
型別大小
範圍格式
用途date
3位元組1000-01-01/9999-12-31
yyyy-mm-dd
日期值time
3位元組'-838:59:59'/'838:59:59'
hh:mm:ss
時間值或持續時間
year
1位元組1901/2155
yyyy
年份值datetime
8位元組1000-01-01 00:00:00/9999-12-31 23:59:59
yyyy-mm-dd hh:mm:ss
混合日期和時間值
timestamp
4位元組1970-01-01 00:00:00/2038
結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2023年1月19日 凌晨 03:14:07
yyyymmdd hhmmss
混合日期和時間值,時間戳
datetime
能儲存1001到2023年,精度為秒。格式為yyyy-mm-dd hh:mm:ss與時區無關,使用八個位元組的儲存空間。
timestamp
時間戳,正如名字一樣。它能儲存從2023年1月1號午夜(格林尼治標準時間)。它只使用四個位元組的儲存空間只能表示1970到2023年。
timestamp顯示的值依賴於時區。mysql伺服器,作業系統,以及客戶端連線都有時區設定。因此儲存值為0時在不同的時區顯示值會有差別。
注:通常情況下應盡量使用timestamp,因為它比datetime效率更高。如果需要儲存更小粒度的時間,可以用bigingt或者轉換成double型別來進行儲存。
mysql 還支援兩種復合資料型別 enum 和 set,它們擴充套件了 sql 規範。雖然這些型別在技術上是字串型別,但是可以被視為不同的資料型別。乙個 enum 型別只允許從乙個集合中取得乙個值;而 set 型別允許從乙個集合中取得任意多個值。
復合型別我們一般用tinyint,更快的時間更省的空間以及更容易擴充套件
mysql優化之選擇資料型別
對資料型別的選擇,可以影響索引的使用,進而影響效能,本博文簡單的說明如何在使用中,選擇資料型別,以幫助查詢過程中,查詢命令能夠更加快速的執行。應該盡可能多的使用數值操作,而不是字串操作。這個好像是顯而易見的,在字串的儲存和比較過程,需要多個位元組的參與。如果 小 型別夠用,就不要選用 大 型別。資料...
MySQL資料型別 資料型別選擇
在mysq中建立表時,需要考慮為字段選擇哪種資料型別是最合適的。選擇合適的資料型別,會提高資料庫的效率。整數型別和浮點數型別最大的區別在於能否表達小數。整數型別不能表示小數,而浮點數型別可以表示小數。不同的整數型別的取值範圍不同。tinyint型別的取值範圍是0 255。如果欄位的最大值不超過255...
MySQL資料型別選擇
在資料庫設計的時候,如果資料型別選擇不當,可能會對效能造成很大的影響,比如儲存姓名的字段,如果選擇vchar 255 那麼暫用更多的儲存空間,同時也會對io產生影響,因此在資料庫設計時對資料庫資料型別的準確選擇,也會對資料庫的效能有乙個很大的提公升。我在工作中就遇到過很多時候一些開發人員不注意對資料...