2012-07-18 81 views
1

正如文檔所說,mysql不會分配您爲varchar指定的完整空間。它存儲實際的數據長度。所以我猜這裏可能還有副作用。就像一個varchar記錄的原始長度是10,現在我想將它更新爲20,但仍然沒有達到指定的限制50.但是,之前分配的空間是不夠的。 所以我的問題是MySQL如何處理這種情況?移動該記錄後的所有內容需要很長時間?還是它必須這樣做? 有沒有人可以告訴我它是如何在內部工作的?提前致謝!使用varchar(x)有什麼危害?

+1

相信我,關於磁盤存儲優化,關係數據庫在過去的40年中走過了很長的路要走。不要爲了小東西而流汗。 – Olaf 2012-07-18 19:23:31

回答

1

MySQL處理得很好,你不應該關心細節。儘管長度不規則的記錄比固定長度的記錄管理起來要慢一些,但是如果記錄通常小於固定大小,那麼通過讀取顯着更少的數據會帶來巨大的性能提升。

請記住,CHAR列總是以最大大小存儲和檢索。即使平均記錄只有10-15字節的數據,255個字符的字段也需要傳輸255個字節。這是相當大的開銷。

使用CHAR提出了一系列其他問題,因爲該字段將始終爲該長度,這意味着它必須完整地傳輸並且通常在客戶端中被剝離。這比麻煩更麻煩。

CHAR列在現代唯一使用的是用於總是定義的東西,並且將始終是一定的大小。一個例子可能是使用40個字符的十六進制編碼哈希值作爲標識符,但這些通常很少見,幾乎在所有情況下,VARCHAR也可以工作。

+0

我可以想到幾個可以使用'char'的例子 - 電話號碼,電話號碼,國家保險號碼等等。但對於大多數情況'varchar'更好。 – 2012-07-18 20:42:27

+0

即使在國家內,郵政編碼的長度也會有很大差異,電話號碼可能會有擴展名,等等。如果你曾經敢於假設*某種特定的固定長度,你通常會感到驚訝。我希望你不是用'CHAR(5)'郵政編碼字段創建數據庫,因爲我之前就已經看到過,而且它已經超越了真氣。 – tadman 2012-07-19 11:27:08

相關問題