MySQL資料型別選擇

2021-08-14 02:14:49 字數 2163 閱讀 3005

在資料庫設計的時候,如果資料型別選擇不當,可能會對效能造成很大的影響,比如儲存姓名的字段,如果選擇vchar(255),那麼暫用更多的儲存空間,同時也會對io產生影響,因此在資料庫設計時對資料庫資料型別的準確選擇,也會對資料庫的效能有乙個很大的提公升。我在工作中就遇到過很多時候一些開發人員不注意對資料型別認真選擇,而是只要能儲存下資料就可以,例如,使用varchar(100)型別儲存姓名字段,用varchar(10)型別儲存日期等等。如果使用的是mysql的innodb儲存引擎,那麼每個資料頁的大小是16k,如果選擇的資料型別占用的儲存空間過大,那麼載入同樣的資料所需要的資料頁也就越多,處理越多的資料頁所需要的io就越多,因此效能也就越低。

整數型別

在mysql資料庫中提供了以下幾種整數型別,以及他們所占用的空間和取值範圍

tinyint 1位元組 -128~127

smallint 2位元組 -32768~32767

mediumint 3位元組 -8388608~8388657

int 4位元組 -2147483648~2147483647

bigint 8位元組 -9223372036854775808~9223372036854775807

在實際應用過程中,根據你的業務要求,選擇合適的整數型別,比如,我曾經見到有人在資料庫中設定乙個標識為,標識客戶的還款狀態,使用的型別是int,其實簡單來說還款了設定1,未還款設定為2(實際情況不只兩種情況)。那麼完全應該使用tinyint型別,而不是使用int型別。

有時候有人可能會使用int(2)來定義資料型別,以為這樣只會占用兩個自己,其實不是,mysql資料庫還是會使用4個位元組來儲存資料。

實數型別

float 4位元組 非精確

double 8位元組 非精確

decimal 每4個位元組儲存9個數字,小數點佔乙個位元組 精確

在財務類或者金融類相關的系統中,一定要使用decimal型別來儲存資金相關的資料,否則大額資金運算會產生偏差。

字串型別

在mysql中經常使用varchar或char來儲存字串型別資料,varchar型別用於儲存變長字串,只占用必要的儲存空間,而char型別是定長的,最大長度是255個字元。需要注意的是,mysql中定義字串長度的單位是字元而不是位元組,這與一些程式語言不通,比如:儲存10個漢字的資料型別,就應該定義成varchar(10)或char(10)。有人可能會問,既然varchar型別是可變長度,而且只占用必要的儲存空間,那麼定義型別的時候可以將字串寬度定義的大一些,也不會有什麼影響。其實不是這樣,mysql資料庫會對sql語句進行查詢優化,在處理查詢優化的時候mysql會使用固定長度的記憶體儲存資料,因此定義的字串寬度越大,所需要的儲存空間就越大,從而降低效能。

varchar型別適用以下場景:

1.字串列的最大長度比平均長度大很多;

2.字串列很少更新,如果字串列更新頻繁,使用varchar型別會造成儲存碎片;

3.使用了多字位元組字符集儲存字串,比如utf-8,實際上我們在平時基本上都會把資料庫和儲存引擎字符集定義為utf-8,這時候如果儲存的字串中既有中文又有英文或資料,建議考慮使用varchar

char型別適用的場景:

1.儲存的字串長度近似,比如身份證號、手機號、md5等;

2.適合儲存短字串;

3.適合儲存更新頻繁的字串,使用char型別可以減少儲存碎片。

日期型別

在我的工作中,見過很多使用字串型別儲存日期和時間的情況,千萬不要這麼做,第一使用字串儲存日期時間型別並不能節省空間,相反往往會浪費空間,第二在進行時間和日期計算時很麻煩。唯一我能想到的好處就是在程式設計的時候不用進行字串轉換了。

在mysql中定義日期和時間的資料型別有以下幾種

datetime型別:儲存日期和時間,格式為:yyyy-mm-dd hh:mm:ss。好像是在mysql5.6之前datetime型別的資料只能精確到秒,在mysql5.6之後,可以使用datetime(6)來儲存微秒。datetime型別占用8個位元組,可以儲存公元1000-01-01到9999-12-31的時間。datetime型別是與時區無關的,也就是說你的資料庫遷移到了美國,改了時區,時間也不會發生變化。

date型別:經常用來儲存出生日期等只需要精確到天的資料,占用3個位元組。

time型別:用於儲存時間,格式為hh:mm:ss

MySQL資料型別 資料型別選擇

在mysq中建立表時,需要考慮為字段選擇哪種資料型別是最合適的。選擇合適的資料型別,會提高資料庫的效率。整數型別和浮點數型別最大的區別在於能否表達小數。整數型別不能表示小數,而浮點數型別可以表示小數。不同的整數型別的取值範圍不同。tinyint型別的取值範圍是0 255。如果欄位的最大值不超過255...

mysql 資料型別選擇

1.1char與varchar 由於char是固定長度的,所以訪問速度比varchar快。缺點是浪費儲存空間,程式需要對行尾進行處理,所以對那些長度變化不大,並且對查詢速度有較高要求的資料可以通過char來訪問。當然這個也是由不同的儲存引擎來決定的。myisam 儲存引擎 建議使用固定長度的資料列代...

mysql 資料型別選擇 Mysql欄位型別選擇

1.欄位型別選擇 1.1盡量少的佔據儲存空間 int整形 年齡 tinyint 1個位元組 0 255之間 烏龜年齡 smallint 2個位元組 0 2的16次方 mediumint 3個位元組 0 2的24次方 int 4個位元組 0 2的32次方 bigint 8個位元組 0 2的64次方 時...