首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 單個索引最多 16 列:實測 17 列直接報錯 ERROR 1070

     編輯:MySQL 資料庫相關知識

MySQL 硬性限制:單個索引最多包含 16 列。超出直接報 ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed。

實測過程

CREATE TABLE test (
  f1 INT, f2 INT, f3 INT, f4 INT, f5 INT, f6 INT,
  f7 INT, f8 INT, f9 INT, f10 INT, f11 INT, f12 INT,
  f13 INT, f14 INT, f15 INT, f16 INT, f17 INT
);

CREATE INDEX idx_16 ON test (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16);  -- OK
CREATE INDEX idx_17 ON test (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17);  -- ERROR 1070

設計啟示

  • 組合索引列數超 16 通常意味著設計過度;考慮拆分索引、引入冗余列、或用哈希列(MD5(CONCAT(...)))替代。
  • 最左前綴原則:INDEX(a,b,c) 支持 a/a,b/a,b,c 查詢,超出 16 列無法受益。
  • 覆蓋索引若需超多列,改用 SELECT ... FROM t WHERE pk IN (SELECT pk FROM t WHERE ...) 回表策略。

版本一致性

MySQL 5.5/5.6/5.7/8.0 均為 16 列上限,源碼 MAX_KEY_PARTS 定義為 16,未來短期內不會調整。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved