Mysql

多字節列的巨大鍵長度值是否會影響索引性能?

  • March 3, 2021

當我查看EXPLAIN結果時,該key len值始終是根據實際列長度乘以所選編碼的最大字節數來計算的。比如說,對於varchar(64)usingutf8編碼,密鑰 len 是 192。

這個數字是否會以任何方式影響性能,我應該盡可能減少它嗎?我的意思是,它是否讓 MySQL 在某處保留一些未使用的空間,或者它只是一個最大可能值,而使用的空間基於確切的數據長度?

所以實際的問題是:如果我有一列只包含拉丁字母和數字,關於索引/整體索引性能佔用的空間,我是否應該將其編碼更改為latin1from ?utf8

這個數字是最壞情況的估計。請記住,EXPLAIN 通常不讀取數據,因此它不知道您的數據是否平均只包含一個 1 字節字元的短字元串,或者它是否包含完整的 64 個字元,每個字元 3 個字節。

查詢的性能在執行期間受讀取頁數的影響更大,並且與實際數據的變化更直接。短字元串值將允許每頁容納更多索引條目,因此需要讀取的頁面更少。這是 EXPLAIN 無法預測的。

我建議不要僅僅為了使 EXPLAIN 輸出“不那麼混亂”而將您的編碼更改為 latin1。這不是一個很好的理由,如果您想在該列中支持 UTF-8 字元,以後勢必會限制您。

在當今時代,幾乎沒有理由使用latin1字元集。我建議將所有字元串預設設置為 utf8mb4。

如果該列具有類似於 uuid 或雜湊值的十六進制數字字元串,那就不同了。您可以將字元集設置為ascii. 但這是出於數據的原因,而不是為了方便閱讀 EXPLAIN 的人。

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