摘要:數據類型優化作者的故事原本覺得數據類型是非常簡單并十分基礎的知識,認為自己掌握的差不多了。數據類型存儲空間時間范圍個字節年年個字節年年通常情況下應該盡量使用,相比于空間效率更高。
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是最主要的字符串類型
VARCHARVARCHAR主要用于存儲可變長字符串,他比定長更節省空間。有一種情況例外,如果MySQL表使用ROW_FORMAT=FIXED創建的話,每一行都會定長存儲。
VARCHAR需要使用1或2個額外字節存儲字符串的長度,如果列的最大長度<=255則使用1個字節,否則使用2個字節。
VARCHAR節省了存儲空間,對性能也有好處。但是由于行是變長的,在update時可能使行變得比原來更長,這就需要額外的工作。
適合用VARCHAR的場景:字符串列的最大長度比平均長度大很多;列的更新少。
CHAR類型是定長的,適合存儲很短的字符串或者所有的值都接近同一個長度。例如非常適合存儲密碼的MD5值。對于經常變更的列,CHAR比VARCHAR更適合。
備注:使用VARCHAR(5)和VARCHAR(200)存儲hello的空間開銷是一樣的,但是更長的列會消耗更多的內存,因為MySQL通常會分配固定大小的內存塊來保存內部值。最好的策略就是只分配真正需要的空間。
日期和時間類型MySQL可以使用很多類型來保存時間和日期,如YEAR和DATE,MySQL能存儲最小時間粒度為秒。
這里主要介紹2種相似的日期類型DATETIME和TIMESTAMP。
數據類型 | 存儲空間 | 時間范圍 |
---|---|---|
DATETIME | 8個字節 | 1001年~9999年 |
TIMESTAMP | 4個字節 | 1970年~2038年 |
通常情況下應該盡量使用TIMESTAMP,相比于DATETIME空間效率更高。有的人會將unix時間戳存儲為整數值,但這不會帶來任何收益(除了特殊情況,如下),數據處理起來也不方便,因此不推薦這樣做。
對于需要存儲比秒更小粒度的日期和時間值情況,建議可以使用BIGINT類型存儲微秒級別的時間戳,或者使用DOUBLE存儲秒之后的小數部分。
總結本篇文章主要是介紹MySQL常用的數據類型,如有錯誤或者不準確的地方,歡迎交流。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/30881.html
摘要:要確保沒有低估需要存儲的值的范圍,更小是相對與數據類型的最大值范圍來講的。如果無法確定哪個數據類型是最好的,就選擇你認為不會超過范圍的最小類型。整數類型有兩個類型的數字整數和實數。列默認為,這與其他的數據類型不一樣。 簡述 良好的邏輯設計和物理設計是高性能系統的基石,比如反范式設計可以加快某些類型的查詢同時也會影響另外一些類型的查詢效率,所以我們必須重視Mysql對于數據庫的設計(本...
摘要:要確保沒有低估需要存儲的值的范圍,更小是相對與數據類型的最大值范圍來講的。如果無法確定哪個數據類型是最好的,就選擇你認為不會超過范圍的最小類型。整數類型有兩個類型的數字整數和實數。列默認為,這與其他的數據類型不一樣。 簡述 良好的邏輯設計和物理設計是高性能系統的基石,比如反范式設計可以加快某些類型的查詢同時也會影響另外一些類型的查詢效率,所以我們必須重視Mysql對于數據庫的設計(本...
閱讀 3309·2021-11-24 09:39
閱讀 2824·2021-10-12 10:20
閱讀 1926·2019-08-30 15:53
閱讀 3086·2019-08-30 14:14
閱讀 2616·2019-08-29 15:36
閱讀 1134·2019-08-29 14:11
閱讀 1964·2019-08-26 13:51
閱讀 3424·2019-08-26 13:23