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
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,未來短期內不會調整。