Mysql

MySQL (InnoDB) CHAR 與 VARCHAR 的 2018 年

  • January 8, 2019

在 2018 年,MySQL ( InnoDB ) CHAR 在 VARCHAR 速度方面表現更好嗎?

我只找到了一個7 歲的性能比較解釋。我檢查了官方的 MySQL 8 CHAR vs VARCHAR但這篇文章只討論了儲存,而不是性能。我還閱讀了一條通知,即 VARCHAR 會導致表碎片出現一些問題(請參閱此答案的第一條評論。

我嚴重懷疑它是否適用於 InnoDB。即使對於 MyISAM(它確實可以有FIXED長度行),它也很少是真的。

粗略地說,這是順序(成本最大的優先)

  1. 磁碟命中。
  2. 找到記錄。
  3. 解析記錄(將其拆分為列)。
  4. 應用函式併計算表達式。

如果數據更大(如CHAR被填充),則 #1 會受到影響。其餘的都變得微不足道。

注意: InnoDB 有 4 種風格ROW_FORMAT

  • 對於REDUNDANT, aCHAR(100) CHARACTER SET utf8mb4 總是佔用 400 個字節。
  • 對於COMPACTor DYNAMIC,它需要 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 是預設值之前編寫的。所以,讓我重新開始……”)

引用自:https://dba.stackexchange.com/questions/226502