首批通过分布式安全可靠测评,为关键业务系统打造
创建索引报长度超过 16KB 的错误
更新时间:2026-05-22 08:56
问题现象
在创建表或索引时,OceanBase 数据库报 key length 超过 16K 的错误。
Oracle 租户
ORA-01450: maximum key length (16384) exceeded示例 1:Oracle 租户内创建索引
创建测试表
test1。obclient [TEST]> create table test1 (c1 number(20), c2 date, c3 varchar2(16384), c4 varchar2(16385), c5 varchar2(4200 char)); Query OK, 0 rows affected (0.009 sec)在测试表
test1字段c1,c2,c3上创建组合索引index test1_i1。obclient [TEST]> create index test1_i1 on test1(c1,c2,c3); Query OK, 0 rows affected (0.360 sec)创建成功:字符类型字段的总长度 16384=16K,非字符类型的字段长度不计入。
在测试表
test1字段c1,c2,c4上创建组合索引index test1_i2。obclient [TEST]> create index test1_i2 on test1(c1,c2,c4); ORA-01450: maximum key length (16384) exceeded创建失败:字符类型字段的总长度 16385>16K,非字符类型的字段长度不计入。
在测试表
test1字段c1,c2,c5上创建组合索引index test1_i2。obclient [TEST]> create index test1_i2 on test1(c1,c2,c5); ORA-01450: maximum key length (16384) exceeded创建失败:字符类型字段的总长度 4200*4=16800>16K,非字符类型的字段长度不计入。
MySQL 租户
ERROR 1071 (42000): Specified key was too long; max key length is 16384 bytes示例 2:MySQL 租户内创建索引
创建测试表
test1。MySQL [test]> create table test1 (c1 bigint(20), c2 date, c3 varchar(16384),c4 varchar(4097),c5 varchar(4096)); Query OK, 0 rows affected (0.065 sec)在测试表
test1字段c1,c2,c3上创建组合索引test1_i1。MySQL [test]> create index test1_i1 on test1(c1,c2,c3); ERROR 1071 (42000): Specified key was too long; max key length is 16384 bytes创建失败:字符类型字段的总长度 16384*4=65536>16K,非字符类型的字段长度不计入。
在测试表
test1字段c1,c2,c4上创建组合索引test1_i1。MySQL [test]> create index test1_i1 on test1(c1,c2,c4); ERROR 1071 (42000): Specified key was too long; max key length is 16384 bytes创建失败:字符类型字段的总长度 4097*4=16388>16K,非字符类型的字段长度不计入。
在测试表
test1字段c1,c2,c5上创建组合索引test1_i1。MySQL [test]> create index test1_i1 on test1(c1,c2,c5); Query OK, 0 rows affected (0.454 sec)创建成功:字符类型字段的总长度 4096*4=16384=16K,非字符类型的字段长度不计入。
问题原因
与 Oracle 和 MySQL 类似,在 OceanBase 数据库中,索引中的字符类型的字段的总长度也有固定限制,大小为 16K (16 * 1024=16384) 字节。 关于此长度限制,需要特别注意以下两点。
16K 的总长度限制只针对索引中字符类型的字段,其他类型的字段不计入该 16K 的长度限制。
在 OceanBase 数据库的 Oracle 租户和 MySQL 租户中定义字符类型时,默认的长度单位有所不同,需要区别对待。
MySQL 租户中,字符类型的默认长度单位是字符(char),而默认的字符集是 utf8bm4,一个字符占位 1 ~ 4 个字节,也就是,当索引中字符的列的总长度(char)超过 4K 就可能达到了 16K 的长度限制。
Oracle 租户中,字符类型的默认长度单位是字节(byte),当索引中字符的列的总长度(byte)超过 16K 才会达到 16K 的长度限制。
适用版本
OceanBase 数据库 V2.x 和 V3.x 版本。
解决方法
通常,我们创建索引的目的是为了加速查询的性能。而一个超大的索引可能并不能提供高效的查询,而且还会带来效大的索引维护的代价。当索引的长度超过 16K 的长度限制时,建议将字符类型的字段长度缩减,或者将超长的字符类型字段从索引中剔除。
相关文档
关于 OceanBase 数据库的使用限制,请参阅 使用限制。