Mysql

MySQL:具有混合字元編碼的列,並查找具有多字節數據的列

  • May 14, 2019

我有一些相當大的 CSV 文件要載入到我的 MySQL 5.7 數據庫中。這些文件有幾 GB 大小,幾百萬行長,並且具有必須在連接中使用的大列寬(有時長達約 500 個字元)。

數據都是標準英文字元,大部分列都可以放入一個單字節字元集,如latin1. 但是,有幾列需要 unicode 來表示商標/註冊/版權符號、測量符號(英寸、英尺、半徑等),因此我一直utf8mb4在所有表格上使用。

這樣做的問題是雙重的。它擴大了我們的索引大小,因此在某些情況下,我們無法在列上創建索引,因為寬度變得大於 3072。此外,它似乎對性能產生了重大影響,大概是因為數據大小是 4 倍。

我想做的是latin1在表中的所有列上使用,並且只utf8mb4在需要它的列上使用。這導致了我的問題-

確定哪些列實際儲存多字節字元的最佳方法是什麼?我可以在載入之前在我的 CSV 中(可能使用 python/pandas 嗎?)或從數據庫中以某種方式檢測到這一點?文件儲存為 utf8。它們目前被載入到一個utf8mb4表中。如果我可以輕鬆地掃描表格並說“此列不包含多字節數據”,我可以將其更改為latin1.

其次,如果我嘗試使用不同編碼的列創建複合索引,我會遇到問題嗎?假設列A是 utf8mb4,列B是 latin1。在這兩列上創建索引有什麼問題嗎?即:CREATE INDEX my_index ON my_table(A, B);。我假設這樣做沒有問題。

數據大小不是 4x。英文文本,即使是 utf8mb4,每個字元也只佔用一個字節。商標(等)符號是多字節的。然後你提到的只有2個字節。表情符號和一些中文是需要 4 個字節的地方。

不要在大列上創建索引。在獲得查詢之前不要創建索引——查詢中得出最佳索引。

讓一列是 latin1 而另一列是 utf8mb4 (等)是非常好的(至少在 MySQL 中)。並且它們都可以在同一個索引中。

我建議對數據進行幾次傳遞。首先使用 utf8mb4 引入所有內容,沒有索引,寬列(例如TEXT)。然後分析你得到了什麼SELECT MAX(CHAR_LENGTH(col2)), ...—— 測試非 latin1 等。對於第二遍,重新執行架構以更接近 max len 等。

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