mysql資料型別優化
作者的故事
原本覺得mysql資料型別是非常簡單並十分基礎的知識,認為自己掌握的差不多了。但經過上一次的面試,才發現自己掌握的並不牢固,很多細節和原理並不知道。後來翻閱了《高效能mysql》這本書,仔細閱讀了第四章schema與資料型別優化。因此,寫這篇文章記錄和總結下,並加深理解。
選擇優化的資料型別
不管儲存哪幾種型別,以下幾個簡單的原則都有助於做出更好的選擇
更小的通常更好
簡單就好
盡量避免null
整數型別
資料型別
儲存空間
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 tinlong MySQL資料型別詳解
引言 mysql中定義資料欄位的型別對你資料庫的優化是非常重要的。mysql支援多種型別,大致可以分為三類 數值 日期 時間和字串 字元 型別,如下腦圖所示 數值型別 型別大小範圍 有符號 範圍 無符號 用途 tinyint 1 位元組 128,127 0,255 小整數值 smallint 2 位...
資料讀取類
今天在聽講座的時候找到了乙個比較好的類,趕緊記下來 呼叫這個類也非常簡單,第一步是設定連線字串 connectionstrings clear add name pubsdata connectionstring data source sqlexpress attachdbfilename dat...
資料採集類
爬蟲,又稱蜘蛛,是從別的 抓取資源的一種方法,c net使用爬蟲的方法如下 protected string getpagehtml string url catch return pageinfo 按上述方法就可以在程式中獲取某url的頁面原始檔。但是有些 遮蔽了爬蟲,那就需要模擬瀏覽器獲取的方法...