1. 程式人生 > >MySQL效能優化之char、varchar、text的區別

MySQL效能優化之char、varchar、text的區別

     參考:https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html

     在儲存字串時, 可以使用char、varchar或者text型別, 那麼具體使用場景呢?

        參考下面這個表結構:



1、 char長度固定, 即每條資料佔用等長位元組空間;適合用在身份證號碼、手機號碼等定。

2、 varchar可變長度,可以設定最大長度;適合用在長度可變的屬性。

3、 text不設定長度, 當不知道屬性的最大長度時,適合用text。

按照查詢速度: char最快, varchar次之,text最慢。

char:char(n)中的n表示字元數,最大長度是255個字元; 如果是utf8編碼方式, 那麼char型別佔255 * 3個位元組。(utf8下一個字元佔用1至3個位元組)

varchar:varchar(n)中的n表示字元數,最大空間是65535個位元組, 存放字元數量跟字符集有關係;

     MySQL5.0.3以前版本varchar(n)中的n表示位元組數;

     MySQL5.0.3以後版本varchar(n)中的n表示字元數;


  PS:varchar實際範圍是65532或65533, 因為內容頭部會佔用1或2個位元組儲存該字串的長度;如果欄位default null(即預設值為空),整條記錄還需要1個位元組儲存預設值null。

       如果是utf8編碼, 那麼varchar最多存65532/3 = 21844個字元。

text:


跟varchar基本相同, 理論上最多儲存65535個字元, 實際上text佔用記憶體空間最大也是65535個位元組; 考慮到字元編碼方式, 一個字元佔用多個位元組, text並不能存放那麼多字元; 跟varchar的區別是text需要2個位元組空間記錄欄位的總位元組數。

PS: 由於varchar查詢速度更快, 能用varchar的時候就不用text。

順便提一句: 當表有成百上千萬條資料時, 就要使用MySQL的分割槽(partition)功能, 原理有點像分治演算法,就是將資料切割成多個部分。