mariadb 8.0 引入了 optimizer trace 性能分析工具,可以通過(guò)它查看 mysql 的執(zhí)行計(jì)劃。在使用 explain 查詢執(zhí)行計(jì)劃時(shí),我們可能會(huì)發(fā)現(xiàn) key_len 的值與預(yù)期不符。本文將探討 mysql 中 key_len 的計(jì)算方式,并解決僅有 3 條記錄時(shí) key_len 為 80 的問(wèn)題。
key_len 的含義
key_len 表示索引鍵的長(zhǎng)度。對(duì)于字符類型,key_len 為每個(gè)字符的字節(jié)數(shù)乘以索引鍵的長(zhǎng)度。
utf8mb4 編碼
問(wèn)題中的 student_name 列使用 utf8mb4 字符集,該字符集使用不同數(shù)量的字節(jié)來(lái)表示不同字符。漢字字符需要 3 個(gè)字節(jié),而英文字母僅需要 1 個(gè)字節(jié)。
key_len 計(jì)算
對(duì)于問(wèn)題中的例子,student_name 列的長(zhǎng)度為 20 個(gè)字符,而一個(gè) utf8mb4 字符為 4 個(gè)字節(jié),因此 key_len 為:
key_len = 20 * 4 = 80
雖然只有 3 條記錄,但 key_len 不受記錄數(shù)的影響。這是因?yàn)樗饕I的長(zhǎng)度是固定的,并且與存儲(chǔ)的數(shù)據(jù)無(wú)關(guān)。
因此,在這種情況下,key_len 為 80 是因?yàn)?utf8mb4 編碼使用 4 個(gè)字節(jié)表示每個(gè)字符,而索引鍵的長(zhǎng)度為 20 個(gè)字符。