MySQL資料型別 選擇與優化

2021-09-11 21:06:13 字數 3966 閱讀 3215

mysql資料型別:數值、日期/時間、字串(字元)型別、復合型別。

一般情況下選擇可以正確儲存資料的最小資料型別。越小的資料型別通常更快,占用磁碟,記憶體和cpu快取更小,大大減少io開銷。

簡單的資料型別的操作通常需要更少的cpu週期。例如:整型比字元操作代價要小得多,因為字符集和校對規則(排序規則)使字元比整型比較更加複雜。比如應該使用mysql內建的型別而不是使用字元型來儲存日期和時間。

盡量制定列為not null,除非真的需要null型別的值。因為可能為null列使得索引,索引統計和值比較都更複雜。可為null的列會使用更多的儲存空間,在mysql裡也需要特殊處理。當可為null列做索引時,每個索引需要乙個額外的位元組,在myisam更有可能導致固定大小的索引變成可變大小索引,在innodb中使用單獨的位(bit)儲存null值。

所以當乙個資料型別可以有多種選擇多種型別的時候,應該優先考慮數字型別,其次是日期或二進位制型別,最後應該是字元型別。盡量使用int而非bigint,如果非負則加上unsigned(這樣數值容量會擴大一倍),當然能使用tinyint、smallint、medium_int更好。使用列舉或整數代替字串型別。盡量使用timestamp而非datetime。使用列舉或整數代替字串型別。用整型來存ip。對於長度相對固定的字段使用char而不是varchar(例如,手機號,md5,身份證號碼)。對於相同級別的資料型別,應該優先選擇占用空間小的資料型別。

原理:在對資料進行比較(查詢條件,join條件及排序)操作時:同樣的資料,字元處理往往比數字處理慢,而且在資料庫中,資料的處理是以頁為單位,列的長度越小,資料型別占用的空間越小,利於效能的提公升。

型別大小範圍(有符號)範圍(無符號)用途

tinyint

1 位元組

(-128,127)

(0,255)

小整數值

smallint

2 位元組

(-32 768,32 767)

(0,65 535)

大整數值

mediumint

3 位元組

(-8 388 608,8 388 607)

(0,16 777 215)

大整數值

int或integer

4 位元組

(-2 147 483 648,2 147 483 647)

(0,4 294 967 295)

大整數值

bigint

8 位元組

(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)

(0,18 446 744 073 709 551 615)

極大整數值

float

4 位元組

(-3.402 823 466 e+38,-1.175 494 351 e-38),0,(1.175 494 351 e-38,3.402 823 466 351 e+38)

0,(1.175 494 351 e-38,3.402 823 466 e+38)

單精度浮點數值

double

8 位元組

(-1.797 693 134 862 315 7 e+308,-2.225 073 858 507 201 4 e-308),0,(2.225 073 858 507 201 4 e-308,1.797 693 134 862 315 7 e+308)

0,(2.225 073 858 507 201 4 e-308,1.797 693 134 862 315 7 e+308)

雙精度浮點數值

decimal(m,d) 

m位元組(d+2 , 如果m < d) 

依賴與m,d

依賴與m,d

小數值(準確精確度)

型別大小

用途char

0-255位元組

定長字串

varchar

0-65535 位元組

變長字串

tinyblob

0-255位元組

不超過 255 個字元的二進位制字串

tinytext

0-255位元組

短文本字串

blob

0-65 535位元組

二進位制形式的長文字資料

text

0-65 535位元組

長文字資料

mediumblob

0-16 777 215位元組

二進位制形式的中等長度文字資料

mediumtext

0-16 777 215位元組

中等長度文字資料

longblob

0-4 294 967 295位元組

二進位制形式的極大文字資料

longtext

0-4 294 967 295位元組

極大文字資料

mysql支援多種字串型別,每個字串列可以定義自己的字符集和排序規則,或者說校對規則,這些東西很大程度上影響效能。

1.varchar可指定n,text不能指定,內部儲存varchar是存入的實際字元數+1個位元組(n<=255)或2個位元組(n>255),text是實際字元數+2個位元組。

2.text型別不能有預設值。

3.varchar可直接建立索引,text建立索引要指定前多少個字元。varchar查詢速度快於text,在都建立索引的情況下,text的索引似乎不起作用。

使用列舉代替字串型別,列舉可以把一些重複的字串儲存成乙個預定義的集合,mysql在儲存列舉時非常緊湊,mysql在列中儲存值為列舉中的位置整數。列舉最不好的是字串是固定的,新增或刪除必須使用alter table。因此對於未來會改變的字串,使用列舉不是乙個好主意,除非能接受在列舉末尾新增元素,由於列舉有乙個對映轉換過程,所以列舉雖然能減少儲存空間,但是也會增加一些額外開銷。

型別大小

範圍格式

用途date

3位元組1000-01-01/9999-12-31

yyyy-mm-dd

日期值time

3位元組'-838:59:59'/'838:59:59'

hh:mm:ss

時間值或持續時間

year

1位元組1901/2155

yyyy

年份值datetime

8位元組1000-01-01 00:00:00/9999-12-31 23:59:59

yyyy-mm-dd hh:mm:ss

混合日期和時間值

timestamp

4位元組1970-01-01 00:00:00/2038

結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2023年1月19日 凌晨 03:14:07

yyyymmdd hhmmss

混合日期和時間值,時間戳

datetime

能儲存1001到2023年,精度為秒。格式為yyyy-mm-dd hh:mm:ss與時區無關,使用八個位元組的儲存空間。

timestamp

時間戳,正如名字一樣。它能儲存從2023年1月1號午夜(格林尼治標準時間)。它只使用四個位元組的儲存空間只能表示1970到2023年。

timestamp顯示的值依賴於時區。mysql伺服器,作業系統,以及客戶端連線都有時區設定。因此儲存值為0時在不同的時區顯示值會有差別。

注:通常情況下應盡量使用timestamp,因為它比datetime效率更高。如果需要儲存更小粒度的時間,可以用bigingt或者轉換成double型別來進行儲存。

mysql 還支援兩種復合資料型別 enum 和 set,它們擴充套件了 sql 規範。雖然這些型別在技術上是字串型別,但是可以被視為不同的資料型別。乙個 enum 型別只允許從乙個集合中取得乙個值;而 set 型別允許從乙個集合中取得任意多個值。

復合型別我們一般用tinyint,更快的時間更省的空間以及更容易擴充套件

mysql優化之選擇資料型別

對資料型別的選擇,可以影響索引的使用,進而影響效能,本博文簡單的說明如何在使用中,選擇資料型別,以幫助查詢過程中,查詢命令能夠更加快速的執行。應該盡可能多的使用數值操作,而不是字串操作。這個好像是顯而易見的,在字串的儲存和比較過程,需要多個位元組的參與。如果 小 型別夠用,就不要選用 大 型別。資料...

MySQL資料型別 資料型別選擇

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

MySQL資料型別選擇

在資料庫設計的時候,如果資料型別選擇不當,可能會對效能造成很大的影響,比如儲存姓名的字段,如果選擇vchar 255 那麼暫用更多的儲存空間,同時也會對io產生影響,因此在資料庫設計時對資料庫資料型別的準確選擇,也會對資料庫的效能有乙個很大的提公升。我在工作中就遇到過很多時候一些開發人員不注意對資料...