Mysql
MySQL (InnoDB) CHAR 與 VARCHAR 的 2018 年
在 2018 年,MySQL ( InnoDB ) CHAR 在 VARCHAR 速度方面表現更好嗎?
我只找到了一個7 歲的性能比較解釋。我檢查了官方的 MySQL 8 CHAR vs VARCHAR但這篇文章只討論了儲存,而不是性能。我還閱讀了一條通知,即 VARCHAR 會導致表碎片出現一些問題(請參閱此答案的第一條評論。
我嚴重懷疑它是否適用於 InnoDB。即使對於 MyISAM(它確實可以有
FIXED
長度行),它也很少是真的。粗略地說,這是順序(成本最大的優先)
- 磁碟命中。
- 找到記錄。
- 解析記錄(將其拆分為列)。
- 應用函式併計算表達式。
如果數據更大(如
CHAR
被填充),則 #1 會受到影響。其餘的都變得微不足道。注意: InnoDB 有 4 種風格
ROW_FORMAT
。
- 對於
REDUNDANT
, aCHAR(100) CHARACTER SET utf8mb4
總是佔用 400 個字節。- 對於
COMPACT
orDYNAMIC
,它需要 100 到 400 個字節。- 對於
COMPRESSED
,填充空間是高度可壓縮的,但仍會佔用一些空間。據稱,a 的“固定”大小
CHAR
(並非完全固定)傾向於防止塊分裂。但我有點懷疑。我的經驗法則:
CHAR
應該幾乎總是限制為真正固定長度的字元串,其中大多數是十六進製或 ascii:country_code CHAR(2) CHARACTER SET ascii british_postal_code CHAR(6) CHARACTER SET ascii zip5 CHAR(5) CHARACTER SET ascii md5 CHAR(32) CHARACTER SET ascii -- UNHEX() into BINARY(16) is tighter base64 CHAR(?) CHARACTER SET ascii COLLATION ascii_bin -- need case-significance
注意:latin1 和 ascii 一樣好用,8.0 預設的 utf8mb4不行。
(另請參閱我對第一個連結的回答。它開始於“這個執行緒中的大多數答案都是 5 歲,在 InnoDB 和 utf8 是預設值之前編寫的。所以,讓我重新開始……”)