看了新公司的資料庫設計,有些問題思考了一下,寫這篇文章也就記錄這個問題的思考過程。
首先從占用空間進行比較,varchar(10) 宣告10個位元組,資料儲存時額外乙個位元組的長度字首;varchar(1000)宣告1000個位元組,如果資料長度大於255,長度字首是兩個位元組。而實際varchar資料型別是根據實際的需要來分配長度的。有問題的參考這篇文章,挺有意思的乙個實驗,關於varchar的思考。
那麼,既然主要關心磁碟占用沒有問題,**可能出現問題
意思就是說對於varchar資料型別來說,硬碟上的儲存空間雖然都是根據實際字元長度來分配儲存空間的,但是對於記憶體來說,則不是。其時使用固定大小的記憶體塊來儲存值。簡單的說,就是使用字元型別中定義的長度,即1000個字元空間,因為其會轉換成char。顯然,這對於排序或者臨時表(這些內容都需要通過記憶體來實現)作業會產生比較大的不利影響。解釋可以參見這裡。
(所以我們在做庫表設計的時候,一些大字段引數進行業務拆表,還有就是資料庫設計時候varchar(n)這個欄位要合理,不能太大。
這邊再貼一下這個過程中發現的一篇有趣的帖子,是關於char和varchar的
儲存**型別
mysql中char和varchar區別
結論 char 定長,效率高 varchar 不定長,效率低。char是一種固定長度的型別,varchar則是一種可變長度的型別,它們的區別是 char m 型別的資料列裡,每個值都占用m個位元組,如果某個長度小於m,mysql就會在它的右邊用空格字元補足 在檢索操作中那些填補出來的空格字元將被去掉...
MySQL中varchar 和char型別介紹
varchar 和char型別是兩種最重要的字串型別,在儲存引擎是innodb或myisam下,討論varchar和char。一 varchar型別 varchar 用於可變長字串,是最常見的字串資料型別。它比定長型別更節省空間,按照儲存的實際字串長度分配空間。varchar需使用1或2個額外位元組...
由MySQL中char和varchar效率想到的
一般認為空間換時間,現在磁碟又大又不值錢 當使用全表都是char這的字段的時候,那麼表屬性row format是fixed也就是靜態表,與之對應的自然就是動態表dynamic,靜態錶比動態表效率要高,主要是因為,基於兩點 1 沒有碎片,每行的長度是固定,所以在頻繁更新的場景下,尤其是某個欄位由小變大...