Mysql建表時選擇資料型別的一些技巧

2021-10-01 02:30:48 字數 2754 閱讀 5303

1. 更小的通常更好

一般情況下,盡量使用可以儲存資料的最小資料型別,更小的資料型別通常更快,因為占用更少的磁碟、記憶體和cpu。

2. 簡單就好

簡單資料型別的操作通常需要更少的cpu週期,可提高處理資料速度。

3. 盡量避免null

通常情況下最好指定列為not null,除非真的需要儲存null。

可為null的列會使用更多的儲存空間,當可謂null的列為索引時,每個索引記錄需要乙個額外的位元組,在myisam中可能會導致固定大小的索引程式設計可變大小的索引。

型別大小

tinyint

8smallint

16mediumint

24int

32bigint

64mysql可以指定整數寬度,例如int(11),它不限制值的合法範圍,只是規定了一些互動工具用來顯示字元的個數,對於儲存和計算來說,int(1) 和int(20)是一樣的。

實數是帶有小數部分的數字,它們可以儲存小數,例如decimal可以儲存比bigint還大的整數。

浮點型別

大小float

4double

8計算方式

實數型別

計算型別

float

近似計算

double

近似計算

decimal

支援精確計算

浮點和decimal都可以指定精度,對於decimal列,可以指定小數點前後允許的最大位數,這也會影響到列的空間消耗。decimal(18,9)小數點兩邊各儲存9個數字,共使用9個位元組:小數點前後的數字各4個位元組,小數點本身佔1個位元組。

精度定義是非標準的,所以建議只指定資料型別,不指定精度

因為需要額外的空間和計算開銷所以應該盡量只對小數進行精確計算才使用decimal,例如儲存財務資料,但在資料量特別大的時候,可考慮採用bigint代替decimal,將需要儲存的貨幣單位根據小數的位數乘以相應的倍數即可。假設儲存的財務資料精確到萬分之一分,則可以把所有金額乘以一百萬,然後將結果儲存在bigint中,這樣可避免浮點儲存計算不精確和decimal精確計算代價高的問題。

varchar

char

可變長字串

定長字元

僅使用必要空間

根據長度分配足夠空間

保留末尾空格

剔除末尾空格

varchar

varchar比定長型別節省空間,因為它只使用必要的空間。

varchar需要消耗1或2個額外位元組記錄字串長度:如果列長度小於或255位元組,則使用1個位元組表示。

例如varchar(10) 需要11個位元組,varchar(1000)需要1002個位元組

varchar節省了儲存空間,但在update時可能會使行變的比原來更長,就會導致需要額外的工作

使用varchar的一些常用場景

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

列的更新很少,所以碎片不是問題

使用utf-8這樣的複雜字符集,每個字元都使用不同的位元組數來儲存。

char

char是定長的

char值會根據需要採用空格進行填充以方便比較

char適合儲存很短的字串,例如char非常適用儲存md5值,對於非常短的列和經常變更的列,char也比varchar要好。

md5 並不是加密演算法,而是摘要演算法。加密演算法是可逆的,摘要演算法是理論上不可逆的。輸入任意長度的明文給他,結果都是乙個定長16 、32、64(取決於加密演算法)。

char檢索時會剔除末尾空格,例如儲存進去』string 『,檢索的結果可能為』string』

blob和text都是為了儲存很大的資料而設計的字串資料型別,分別採用二進位制和字元方式儲存。

事實上他們屬於兩組不同的資料型別家族

二進位制字元型tinytext

tinyblob

smalltext

smallblob

text

blob

mediumtext

mediumblob

longtext

longblob

當blob和text太大時,innodb會使用專門的「外部」儲存區域來進行儲存,此時每個值需要1~4個位元組儲存乙個指標,然後在外部的儲存區域儲存實際的值。

blob和text唯一的不同是blob儲存的二進位制資料,沒有排序規則或者字符集。而text型別有字符集和排序規則

mysql不能將blob和text列的全部長度的字串進行索引,也不能使用索引來消除排序。

有時候可以用列舉列代替常用的字串型別。mysql在儲存列舉時非常緊湊,會在表中的frm檔案中儲存「數字-字串」對映關係的「查詢表」,查詢出來的資料只有整數

如果使用數字作為enum的列舉常量,很容易導致混亂,避免這樣做

可以在查詢中使用field( )函式顯示的指定排序,但這也會導致mysql無法利用索引消除排序。

列舉的缺點:字串列表是固定的,新增或刪除的字串必須使用alter table。

列舉和varchar關聯查詢

以varchar和varchar的關聯速度為常速做對比
enum和enum關聯,關聯速度很快

enum和varchar關聯,速度略慢(雖然效率低但可能可以節省i/o,可行性較高)

MYSQL建表時資料型別的選擇

對於相同級別的資料型別,應該優先選擇占用空間小的資料型別。大小範圍 signed 範圍 unsigned 用途tinyint 1 位元組 128,127 0,255 小整數值,如年齡 smallint 2 位元組 32768,32 767 0,65535 大整數值 mediumint 3 位元組 8...

mysql 建表時,我們應該考慮的資料型別

本文是由 高效能mysql 摘錄而來 如何選擇最優的資料型別,請看下面幾個原則 1 更小通常更好 好處 占用更少磁碟 記憶體和cpu快取,處理時需要的cpu週期更少 2 簡單就好 簡單資料型別通常需要更少的cpu週期,例子 用mysql內建日期型別 date,datetime,timestample...

MySQL建表過程 資料型別

a.主要學習列型別的儲存範圍與佔據的位元組關係 b.儲存同樣的資料不同列型別所佔據的空間和效率是不一樣的 c.乙個位元組八個位 d.參考 1 數值型 b.整形 tinyint 佔1個位元組 128 127 or 0 255 smallint 2個位元組 mediuint 3個位元組 int 4個位元...