MySQL Error 1071 SQLSTATE: 42000 (ER_TOO_LONG_KEY) Specified key was too long; max key length is %d bytes
is a common stumbling block when creating an index on a column with a string type (like VARCHAR
or TEXT
). This error message indicates that the size of the index you’re trying to create exceeds the limit for the storage engine. The %d
in the error message will show the maximum allowed key length in bytes. Understanding and resolving this error is crucial for maintaining efficient database structures. Here are various scenarios that lead to this error and how to address them.
Possible Causes and Solutions
Column Charset and Length Issues
The most common cause for Error 1071 is when the combined size of the character set and column length exceeds the maximum key length.
Solution:
Reduce the column length or change the character set to one that uses fewer bytes per character.
Example:
-- Assuming the default charset is utf8mb4, which uses 4 bytes per character
-- and the max key length is 767 bytes:
CREATE TABLE my_table (
my_column VARCHAR(255) -- This would exceed the limit (255 * 4 = 1020 bytes)
PRIMARY KEY (my_column)
); -- Incorrect
-- To fix this, reduce the column length
CREATE TABLE my_table (
my_column VARCHAR(191) -- This would not exceed the limit (191 * 4 = 764 bytes)
PRIMARY KEY (my_column)
); -- Correct
Using Prefix Indexing
If you cannot reduce the column size or change the charset, consider using a prefix index where you only index a prefix of the string column.
Solution:
Specify a prefix length for the index.
Example:
CREATE TABLE my_table (
my_column VARCHAR(255),
PRIMARY KEY (my_column(191)) -- Indexes only the first 191 characters
);
Changing the Storage Engine
Different storage engines in MySQL have different maximum key lengths. For example, the InnoDB engine has a limit of 767 bytes, but this can vary.
Solution:
Consider changing the storage engine if it provides a higher limit that suits your needs.
Example:
-- Change the storage engine to MyISAM which allows longer key lengths
CREATE TABLE my_table (
my_column VARCHAR(255),
PRIMARY KEY (my_column)
) ENGINE=MyISAM; -- MyISAM allows a key length of up to 1000 bytes
Configuring InnoDB Large Prefix
If you are using the InnoDB storage engine, MySQL versions 5.7.7 and later support a larger key length if the innodb_large_prefix
option is enabled.
Solution:
Enable the innodb_large_prefix
option.
Example:
# Set the following in your MySQL configuration file (my.cnf or my.ini)
[mysqld]
innodb_large_prefix=1 innodb_file_format=barracuda innodb_file_per_table=1
After making this change, restart the MySQL server for the new settings to take effect.
Conclusion
To diagnose and fix MySQL Error 1071, you should:
- Check the character set and column length to ensure they do not exceed the maximum key length.
- Consider using a prefix index to index only a part of the string column.
- Explore using a different storage engine that allows for a longer key length.
- For InnoDB, enable
innodb_large_prefix
and use theBarracuda
file format for larger key lengths.
By carefully examining and adjusting your database schema with these strategies, you can resolve Error 1071 and create efficient and effective indexes. For more in-depth information, the MySQL documentation is a valuable resource, and the MySQL community can provide additional support for complex situations.