首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL InnoDB UTF8MB4 VARCHAR 索引長度限制:767/3072 位元組邊界實測與應對

     編輯:MySQL 綜合教學

限制數值

  • 單欄索引上限: 767 位元組(InnoDB 內部上限 3500,MySQL 層面限制 3072,非 64 位元舊版 1024)。
  • 聯合索引總長度: 3072 位元組。

UTF8MB4 實測邊界

實測錯誤訊息

CREATE TABLE t (id BIGINT PRIMARY KEY, a VARCHAR(255)) CHARSET=utf8mb4;
ALTER TABLE t ADD INDEX idx_a (a);
-- ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

聯合索引實測

CREATE TABLE t2 (
    id BIGINT PRIMARY KEY,
    a TEXT, b TEXT, c TEXT, d TEXT, e TEXT
) CHARSET=utf8mb4;

-- 255*4 = 1020 bytes per column prefix
-- 4 columns * 1020 = 4080 > 3072 會失敗
ALTER TABLE t2 ADD INDEX idx_abcd (a(255), b(255), c(255), d(255));
-- ERROR 1071: max key length is 3072 bytes

-- 正確:4 個 255 前綴 = 4*765 = 3060 < 3072
ALTER TABLE t2 ADD INDEX idx_abcd (a(255), b(255), c(255), d(255));
-- 成功(每欄前綴 255 字元 = 765 位元組)
注意:a(255) 表示**字元數**前綴,UTF8MB4 實際佔 765 位元組。

應對策略

  1. 縮短欄位長度: 業務允許時用 VARCHAR(191) 替代 255。
  2. 使用前綴索引: INDEX idx_name (long_col(50)),覆蓋率評估 SELECT COUNT(DISTINCT LEFT(col,50))/COUNT(*) FROM t。
  3. 升級 MySQL 5.7.7+ / 8.0: 啟用 innodb_large_prefix=ON(預設開啟),單欄索引上限放寬至 **3072 位元組**,VARCHAR(255) 可直接建立索引。
  4. 改用哈希索引/全文索引: 長字串精確查詢可存 CRC32/MD5 值建立索引,或 FULLTEXT。
  5. 避免過長聯合索引: 單表索引總長度逼近 3072 時,拆分為多個索引或調整查詢模式。

版本對照

欄位定義位元組數 (含長度前綴)可否建立單欄索引
VARCHAR(255)255×4 + 2 = 1022❌ 超過 767
VARCHAR(191)191×4 + 2 = 766✅ 最大安全長度
VARCHAR(255) CHARSET=utf8255×3 + 2 = 767✅ 緊貼上限
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
版本innodb_large_prefix單欄索引上限備註
5.6 / 5.7.6-OFF (預設)767 bytes需手動開啟 + 重啟 + 表重建
5.7.7+ / 8.0ON (預設)3072 bytes無感支援 VARCHAR(255) utf8mb4 索引