Mysql 如果唯一键很长,则将MYISAM表转换为INNODB

Mysql 如果唯一键很长,则将MYISAM表转换为INNODB,mysql,innodb,myisam,Mysql,Innodb,Myisam,由于MYISAM每次都会锁定整个表,因此我考虑将MYISAM表转换为InnoDB。但是,INNODB要求唯一密钥和主键在767字节以内 所以,我得到了这个错误:- #1071 - Specified key was too long; max key length is 767 bytes 我的专用钥匙有点长。那么,对于我来说,将表转换为INNODB的最佳方式是什么 这是描述我的桌子的截图 谢谢假设屏幕截图中显示的键是您所有的,这里讨论的键是query\u id。作为一个300字符的UTF

由于MYISAM每次都会锁定整个表,因此我考虑将MYISAM表转换为InnoDB。但是,INNODB要求唯一密钥和主键在767字节以内

所以,我得到了这个错误:-

#1071 - Specified key was too long; max key length is 767 bytes 
我的专用钥匙有点长。那么,对于我来说,将表转换为INNODB的最佳方式是什么

这是描述我的桌子的截图


谢谢

假设屏幕截图中显示的键是您所有的,这里讨论的键是
query\u id
。作为一个300字符的UTF8列,它最终仅使用900字节

您需要将索引限制为该列的一部分,例如,可能是前100个字符

DROP INDEX query_id ON tablename
CREATE INDEX query_id ON tablename (query_id, position, prod(100))

假设屏幕截图中显示的键是您所拥有的所有键,这里讨论的键是
query\u id
。作为一个300字符的UTF8列,它最终仅使用900字节

您需要将索引限制为该列的一部分,例如,可能是前100个字符

DROP INDEX query_id ON tablename
CREATE INDEX query_id ON tablename (query_id, position, prod(100))

在转换表之前,请调整其顺序,以便主键列按顺序排列

> ALTER TABLE tablename ORDER BY 'primary_key_column';
这将预先安排表,以便可以快速转换,而无需在MySQL中进行大量重新安排。然后,只需更改表引擎:

> ALTER TABLE tablename ENGINE = INNODB;

在转换表之前,请调整其顺序,以便主键列按顺序排列

> ALTER TABLE tablename ORDER BY 'primary_key_column';
这将预先安排表,以便可以快速转换,而无需在MySQL中进行大量重新安排。然后,只需更改表引擎:

> ALTER TABLE tablename ENGINE = INNODB;

请出示表格定义。您使用的排序规则是什么?@tombom我的排序规则是utf8\u unicode\u ci。我正在添加我的表格结构的屏幕截图,以更新questionshow表格定义。您使用的排序规则是什么?@tombom我的排序规则是utf8\u unicode\u ci。我正在添加我的表格结构的屏幕截图,作为问题的更新