將 TEXT 更改為 VARCHAR
在 MySQL 數據庫 (InnoDB) 中,我們有一個包含大約 60.000.000 行的表。其中一列是類型
text
。目前最長的條目長度為 360(使用 找到
SELECT MAX(LENGTH(value))
),理論最大值將來自varchar(511)
列。列上沒有索引。有人建議我嘗試看看我們是否可以將此專欄從
text
其他內容移至其他內容,但我正在努力找出這是否會有所幫助。我當然做了一些研究,但我也想看看我是否正確。我知道“隨機建議”並不太被重視,但乍一看,它似乎有一些優點:text
很大,最多 511 個字元並沒有那麼大。但是,據我所知,(更大?)varchar/varbinary 和 text/blob 在使用 InnoDB 時的處理方式相同。使用大值可能面臨的問題是,在使用文本時,並非所有內容都儲存在光碟上的同一“行”(頁面?不確定此處的術語)中。有幾個消息來源說這是一種誤解,因為某些文本實際上保存在與普通行相同的位置。(我希望我描述的是正確的)
最後,我的結論是,目前將此列更改為某種 varchar(可能
varchar(511)
)沒有任何特定的額外價值。
這聽起來有點熟悉。哦,是的,我在 2012 年 8 月 14 日寫過這篇文章:錯誤 1118:行大小太大。utf8 innodb . 以下是 Percona 專家關於此主題的附加資訊:InnoDB create table error: “Row size too large”
我可以看到這在行長度限制方面給 InnoDB 錶帶來了壓力。將不祥長度的 TEXT 欄位轉換為 VARCHAR 甚至 InnoDB 中的 CHAR 將沒有效果(至少,沒有正面效果)。
你的擔心是有道理的,值得尊重。為什麼?
有些人會執行以下操作之一:
- 執行轉換並處理(主要是抱怨)更糟糕的後果
- 在開發伺服器中進行轉換,查看效果,並據此判斷
- 詢問原因,進行研究,在開發伺服器中進行盡職調查
聽起來您從上面的列表中選擇了選項 #3。鑑於數據的長度,您的結論對於給定的數據集是正確的。