Mysql

將 TEXT 更改為 VARCHAR

  • April 9, 2013

在 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。鑑於數據的長度,您的結論對於給定的數據集是正確的。

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