国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MySQL數(shù)據(jù)類型

entner / 872人閱讀

摘要:數(shù)據(jù)類型優(yōu)化作者的故事原本覺得數(shù)據(jù)類型是非常簡單并十分基礎(chǔ)的知識,認(rèn)為自己掌握的差不多了。數(shù)據(jù)類型存儲空間時間范圍個字節(jié)年年個字節(jié)年年通常情況下應(yīng)該盡量使用,相比于空間效率更高。

MySQL數(shù)據(jù)類型優(yōu)化 作者的故事

原本覺得mysql數(shù)據(jù)類型是非常簡單并十分基礎(chǔ)的知識,認(rèn)為自己掌握的差不多了。但經(jīng)過上一次的面試,才發(fā)現(xiàn)自己掌握的并不牢固,很多細(xì)節(jié)和原理并不知道。后來翻閱了《高性能mysql》這本書,仔細(xì)閱讀了第四章Schema與數(shù)據(jù)類型優(yōu)化。因此,寫這篇文章記錄和總結(jié)下,并加深理解。

選擇優(yōu)化的數(shù)據(jù)類型

不管存儲哪幾種類型,以下幾個簡單的原則都有助于做出更好的選擇

更小的通常更好

簡單就好

盡量避免null

整數(shù)類型
數(shù)據(jù)類型 存儲空間
TINYINT 8位
SMALLINT 16位
MEDINUMINT 24位
INT 32位
BIGINT 64位

取值范圍:-2^(N-1) ~ 2^(N-1)-1,N位存儲空間的位數(shù)。
整數(shù)類型有可選的UNSIGNED類型,表示不允許負(fù)值,這大致可以使正數(shù)的上限提高一倍。例如 TINYINT UNSIGNED可以存儲的范圍是0~255,而TINYINT的存儲范圍是-128~127。
有符號和無符號類型使用相同的存儲空間,并且具有相同的性能,因此可根據(jù)實(shí)際情況選擇合適的類型。

MySQL可以為整數(shù)類型指定寬度,例如INT(11),對大多數(shù)應(yīng)用是沒有意義的,他不會限制值的合法范圍,只是規(guī)定了MySQL的一些交互工具(如MySQL命令行客戶端)用來顯示字符的個數(shù)。對于存儲和計算來說,INT(1)和INT(20)是相同的。

實(shí)數(shù)類型

浮點(diǎn)類型和DECIMAL類型都可以指定精度。
對于DECIMAL列,可以指定小數(shù)點(diǎn)前后所允許的最大位數(shù)。這會影響列的空間消耗。MySQL5.0和更高版本將數(shù)字打包保存到一個二進(jìn)制字符串中(每4個字節(jié)存9個數(shù)字)。例如DECIMAL(18,9)小數(shù)點(diǎn)兩邊各存儲9個數(shù)字,一共使用9個字節(jié),小數(shù)點(diǎn)前后各占4個字節(jié),小數(shù)點(diǎn)占1個字節(jié)。

浮點(diǎn)類型在存儲同樣的值時,通常比DECIMAL使用更少的空間。FLOAT使用4個字節(jié),DOUBLE使用8個字節(jié),相比FLOAT有更高的精度和更大的范圍。

因?yàn)樾枰~外的空間和計算開銷,所以應(yīng)該盡量只在對小數(shù)進(jìn)行精確計算時才使用DECIMAL,例如存儲財務(wù)數(shù)據(jù)。但是在數(shù)據(jù)量比較大的時候,可以考慮使用BIGINT代替DECIMAL,將要存儲的值根據(jù)小數(shù)的位數(shù)乘以相應(yīng)的倍數(shù)即可。

字符串類型

VARCHAR和CHAR是最主要的字符串類型

VARCHAR

VARCHAR主要用于存儲可變長字符串,他比定長更節(jié)省空間。有一種情況例外,如果MySQL表使用ROW_FORMAT=FIXED創(chuàng)建的話,每一行都會定長存儲。
VARCHAR需要使用1或2個額外字節(jié)存儲字符串的長度,如果列的最大長度<=255則使用1個字節(jié),否則使用2個字節(jié)。
VARCHAR節(jié)省了存儲空間,對性能也有好處。但是由于行是變長的,在update時可能使行變得比原來更長,這就需要額外的工作。
適合用VARCHAR的場景:字符串列的最大長度比平均長度大很多;列的更新少。

CHAR

CHAR類型是定長的,適合存儲很短的字符串或者所有的值都接近同一個長度。例如非常適合存儲密碼的MD5值。對于經(jīng)常變更的列,CHAR比VARCHAR更適合。

備注:使用VARCHAR(5)和VARCHAR(200)存儲hello的空間開銷是一樣的,但是更長的列會消耗更多的內(nèi)存,因?yàn)镸ySQL通常會分配固定大小的內(nèi)存塊來保存內(nèi)部值。最好的策略就是只分配真正需要的空間。

日期和時間類型

MySQL可以使用很多類型來保存時間和日期,如YEAR和DATE,MySQL能存儲最小時間粒度為秒。
這里主要介紹2種相似的日期類型DATETIME和TIMESTAMP。

數(shù)據(jù)類型 存儲空間 時間范圍
DATETIME 8個字節(jié) 1001年~9999年
TIMESTAMP 4個字節(jié) 1970年~2038年

通常情況下應(yīng)該盡量使用TIMESTAMP,相比于DATETIME空間效率更高。有的人會將unix時間戳存儲為整數(shù)值,但這不會帶來任何收益(除了特殊情況,如下),數(shù)據(jù)處理起來也不方便,因此不推薦這樣做。

對于需要存儲比秒更小粒度的日期和時間值情況,建議可以使用BIGINT類型存儲微秒級別的時間戳,或者使用DOUBLE存儲秒之后的小數(shù)部分。

總結(jié)

本篇文章主要是介紹MySQL常用的數(shù)據(jù)類型,如有錯誤或者不準(zhǔn)確的地方,歡迎交流。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/30881.html

相關(guān)文章

  • 深入Mysql - 談?wù)勎覍?em>數(shù)據(jù)類型的認(rèn)識

    摘要:要確保沒有低估需要存儲的值的范圍,更小是相對與數(shù)據(jù)類型的最大值范圍來講的。如果無法確定哪個數(shù)據(jù)類型是最好的,就選擇你認(rèn)為不會超過范圍的最小類型。整數(shù)類型有兩個類型的數(shù)字整數(shù)和實(shí)數(shù)。列默認(rèn)為,這與其他的數(shù)據(jù)類型不一樣。 簡述 良好的邏輯設(shè)計和物理設(shè)計是高性能系統(tǒng)的基石,比如反范式設(shè)計可以加快某些類型的查詢同時也會影響另外一些類型的查詢效率,所以我們必須重視Mysql對于數(shù)據(jù)庫的設(shè)計(本...

    SillyMonkey 評論0 收藏0
  • 深入Mysql - 談?wù)勎覍?em>數(shù)據(jù)類型的認(rèn)識

    摘要:要確保沒有低估需要存儲的值的范圍,更小是相對與數(shù)據(jù)類型的最大值范圍來講的。如果無法確定哪個數(shù)據(jù)類型是最好的,就選擇你認(rèn)為不會超過范圍的最小類型。整數(shù)類型有兩個類型的數(shù)字整數(shù)和實(shí)數(shù)。列默認(rèn)為,這與其他的數(shù)據(jù)類型不一樣。 簡述 良好的邏輯設(shè)計和物理設(shè)計是高性能系統(tǒng)的基石,比如反范式設(shè)計可以加快某些類型的查詢同時也會影響另外一些類型的查詢效率,所以我們必須重視Mysql對于數(shù)據(jù)庫的設(shè)計(本...

    junbaor 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<