不一样于oracle,在mysql的Innodb存储引擎中,对索引的总长度有限制。在mysql 5.7中(https://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html),默认为3072。html
If innodb_large_prefix
is enabled (the default), the index key prefix limit is 3072 bytes for InnoDB
tables that use DYNAMIC
orCOMPRESSED
row format. If innodb_large_prefix
is disabled, the index key prefix limit is 767 bytes for tables of any row format.mysql
innodb_large_prefix
is deprecated and will be removed in a future release. innodb_large_prefix
was introduced in MySQL 5.5 to disable large index key prefixes for compatibility with earlier versions of InnoDB
that do not support large index key prefixes.sql
The index key prefix length limit is 767 bytes for InnoDB
tables that use the REDUNDANT
or COMPACT
row format. For example, you might hit this limit with a column prefix index of more than 255 characters on a TEXT
or VARCHAR
column, assuming a utf8mb3
character set and the maximum of 3 bytes for each character.mongodb
Attempting to use an index key prefix length that exceeds the limit returns an error. To avoid such errors in replication configurations, avoid enabling innodb_large_prefix
on the master if it cannot also be enabled on slaves.json
The limits that apply to index key prefixes also apply to full-column index keys.oracle
因此在GBK编码中,最大能够到1536个字符,utf8/utf8mb3,1024个字符,utf8mb4为768个字符。这一限制为自然限制(mariadb由于采用Innodb引擎,该限制一样存在),没法绕开。app
drop table big_index_test;
create table big_index_test(id int,content varchar(1000)) ROW_FORMAT=DYNAMIC CHARACTER set = utf8mb4 ;
create index idx_big_index on big_index_test(content);性能
[SQL]create index idx_big_index on big_index_test(content);
[Err] 1071 - Specified key was too long; max key length is 3072 bytes优化
相对于oracle来讲,若是定义存在这种状况,即便记录没有或不多,仍然没法利用索引覆盖查询实现一些宽表的优化。this
所以,对于mysql而言,对于一些定义很长的detail,最好的方式是垂直拆表,也就是将id和detail字段存储在单独的表中,而后业务代码中二次select的方式优化。若是detail字段是json类型的话,能够直接存储为json类型或存储在NoSQL中如mongodb。
注:当年5.6的时候,帮一个产品优化过mysql,mysql在大字段的处理上性能很是低下。