在探索SQL 查詢效能問題時,使用者嘗試透過向products.name 欄位新增索引來最佳化查詢,該索引為定義為varchar (512)。指定為product_name_idx (name(512)) 的原始索引導致索引不用於排序,因為它被識別為前綴索引。
為了解決此問題,使用者嘗試截斷名稱列到 varchar(255)。進行此變更後,後續的 EXPLAIN 語句表示正在使用索引。
此行為源自於 MySQL 對 UTF-8 字元長度的假設。在 MySQL 中,單一列的最大索引大小為 767 位元組。在 MySQL 8.0 之前,utf8 字元集被限制為每個字元最多 3 個位元組。然而,在 MySQL 8.0 中,這種情況發生了變化,utf8mb3 現已被棄用,並被 utf8mb4 取代,它支援每個字元最多 4 個位元組。
在 8.0 之前的 MySQL 版本中,指定大於預設值的索引長度varchar(255) 欄位的 255 個字元將導致錯誤。這是因為 MySQL 假設 UTF-8 每個字元 3 個位元組,而 256 個字元的索引將超出 767 個位元組的限制。
使用 MySQL 8.0 和 utf8mb4 字元集,每個字元 3 個位元組的假設仍然適用。然而,隨著壓縮和動態行格式的引入,索引鍵前綴可以達到 3072 位元組。因此,可以在字元數較多的 varchar 列上建立索引。
總而言之,在早期的 MySQL 版本中,由於假設每個 3 個位元組,varchar 欄位的索引長度限制為 255 個字元。 UTF-8 字元和 767 位元組最大索引大小。在 MySQL 8.0 和 utf8mb4 中,對於壓縮和動態行格式,此限制已經放寬,允許 varchar 欄位上有更長的索引。
以上是為什麼 MySQL 的 varchar 索引長度限制在不同版本之間有所不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!