原本覺得mysql資料型別是非常簡單並十分基礎的知識,認為自己掌握的差不多了。但經過上一次的面試,才發現自己掌握的並不牢固,很多細節和原理並不知道。後來翻閱了《高效能mysql》這本書,仔細閱讀了第四章schema與資料型別優化。因此,寫這篇文章記錄和總結下,並加深理解。
不管儲存哪幾種型別,以下幾個簡單的原則都有助於做出更好的選擇
資料型別
儲存空間
tinyint
8位smallint
16位medinumint
24位int
32位bigint
64位 取值範圍:-2^(n-1) ~ 2^(n-1)-1,n位儲存空間的位數。
整數型別有可選的unsigned型別,表示不允許負值,這大致可以使正數的上限提高一倍。例如 tinyint unsigned可以儲存的範圍是0~255,而tinyint的儲存範圍是-128~127。
有符號和無符號型別使用相同的儲存空間,並且具有相同的效能,因此可根據實際情況選擇合適的型別。
mysql可以為整數型別指定寬度,例如int(11),對大多數應用是沒有意義的,他不會限制值的合法範圍,只是規定了mysql的一些互動工具(如mysql命令列客戶端)用來顯示字元的個數。對於儲存和計算來說,int(1)和int(20)是相同的。
浮點型別和decimal型別都可以指定精度。
對於decimal列,可以指定小數點前後所允許的最大位數。這會影響列的空間消耗。mysql5.0和更高版本將數字打包儲存到乙個二進位制字串中(每4個位元組存9個數字)。例如decimal(18,9)小數點兩邊各儲存9個數字,一共使用9個位元組,小數點前後各佔4個位元組,小數點佔1個位元組。
浮點型別在儲存同樣的值時,通常比decimal使用更少的空間。float使用4個位元組,double使用8個位元組,相比float有更高的精度和更大的範圍。
因為需要額外的空間和計算開銷,所以應該盡量只在對小數進行精確計算時才使用decimal,例如儲存財務資料。但是在資料量比較大的時候,可以考慮使用bigint代替decimal,將要儲存的值根據小數的位數乘以相應的倍數即可。
varchar和char是最主要的字串型別
varchar
varchar主要用於儲存可變長字串,他比定長更節省空間。有一種情況例外,如果mysql表使用row_format=fixed建立的話,每一行都會定長儲存。
varchar需要使用1或2個額外位元組儲存字串的長度,如果列的最大長度<=255則使用1個位元組,否則使用2個位元組。
varchar節省了儲存空間,對效能也有好處。但是由於行是變長的,在update時可能使行變得比原來更長,這就需要額外的工作。
適合用varchar的場景:字串列的最大長度比平均長度大很多;列的更新少。
char
char型別是定長的,適合儲存很短的字串或者所有的值都接近同乙個長度。例如非常適合儲存密碼的md5值。對於經常變更的列,char比varchar更適合。
備註:使用varchar(5)和varchar(200)儲存hello的空間開銷是一樣的,但是更長的列會消耗更多的記憶體,因為mysql通常會分配固定大小的記憶體塊來儲存內部值。最好的策略就是只分配真正需要的空間。
mysql可以使用很多態別來儲存時間和日期,如year和date,mysql能儲存最小時間粒度為秒。
這裡主要介紹2種相似的日期型別datetime和timestamp。
資料型別
儲存空間
時間範圍
datetime
8個位元組
2023年~2023年
timestamp
4個位元組
2023年~2023年
通常情況下應該盡量使用timestamp,相比於datetime空間效率更高。有的人會將unix時間戳儲存為整數值,但這不會帶來任何收益(除了特殊情況,如下),資料處理起來也不方便,因此不推薦這樣做。
對於需要儲存比秒更小粒度的日期和時間值情況,建議可以使用bigint型別儲存微秒級別的時間戳,或者使用double儲存秒之後的小數部分。
mysql資料型別用法 mysql資料型別和用法
歡迎進入linux社群論壇,與200萬技術人員互動交流 進入 mysql支援多種列型別 數值型別 日期 時間型別和字串 字元 型別。本章首先對這些列型別進行了概述,然後更加詳細地描述了各種列的型別,以及列型別儲存需求的總結。概述很簡單。關於具體列型別 歡迎進入linux社群論壇,與200萬技術人員互...
mysql 資料型別 真假 MySQL 資料型別
mysql基礎 資料型別 整型型別 根據所儲存的整數數值取值範圍不同,可分為以下五類 1 tinyint佔1個位元組 2 smallint佔2個位元組 3 mediumint 佔3個位元組 4 int佔4個位元組 5 bigint佔8個位元組 根據每種型別所佔的位元組數可確定其無符號整數和有符號整數...
mysql 郵箱 資料型別 mysql 資料型別
1 整型mysql資料型別含義 有符號 tinyint m 1個位元組 範圍 128 127 smallint m 2個位元組 範圍 32768 32767 mediumint m 3個位元組 範圍 8388608 8388607 int m 4個位元組 範圍 2147483648 21474836...