Mysql
多字節列的巨大鍵長度值是否會影響索引性能?
當我查看
EXPLAIN
結果時,該key len
值始終是根據實際列長度乘以所選編碼的最大字節數來計算的。比如說,對於varchar(64)
usingutf8
編碼,密鑰 len 是 192。這個數字是否會以任何方式影響性能,我應該盡可能減少它嗎?我的意思是,它是否讓 MySQL 在某處保留一些未使用的空間,或者它只是一個最大可能值,而使用的空間基於確切的數據長度?
所以實際的問題是:如果我有一列只包含拉丁字母和數字,關於索引/整體索引性能佔用的空間,我是否應該將其編碼更改為
latin1
from ?utf8
這個數字是最壞情況的估計。請記住,EXPLAIN 通常不讀取數據,因此它不知道您的數據是否平均只包含一個 1 字節字元的短字元串,或者它是否包含完整的 64 個字元,每個字元 3 個字節。
查詢的性能在執行期間受讀取頁數的影響更大,並且與實際數據的變化更直接。短字元串值將允許每頁容納更多索引條目,因此需要讀取的頁面更少。這是 EXPLAIN 無法預測的。
我建議不要僅僅為了使 EXPLAIN 輸出“不那麼混亂”而將您的編碼更改為 latin1。這不是一個很好的理由,如果您想在該列中支持 UTF-8 字元,以後勢必會限制您。
在當今時代,幾乎沒有理由使用
latin1
字元集。我建議將所有字元串預設設置為 utf8mb4。如果該列具有類似於 uuid 或雜湊值的十六進制數字字元串,那就不同了。您可以將字元集設置為
ascii
. 但這是出於數據的原因,而不是為了方便閱讀 EXPLAIN 的人。