问题是为表' visits_visit'创建索引。 (Django访问app),因为每个查询持续至少60毫秒,并且会更糟。
CREATE INDEX resource ON visits_visit (object_app(200), object_model(200), object_id(200));
它返回:
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes
怎么办?表的结构在屏幕截图上。
答案 0 :(得分:1)
请参阅您的问题评论中已经回答的可能重复问题的引用。或者我应该说一个规范的重复目标来关闭这个问题,如果它关闭。也就是说,在存储引擎或字符集方面,该引用并不多。
在您的情况下,字符集会在复合索引中使用字符串类型列。
旁注当然是表现。不要指望一个伟大的人与你正在尝试的东西。您的索引太宽,甚至可能不是预期的用途。索引及其利益需要仔细审查。这可以通过使用mysql explain
来确定。请参阅operator precedence,特别是“一般评论”部分。
请参阅以下文章the following,以下是摘录。
字符限制取决于您使用的字符集。例如 如果你使用latin1,那么你可以索引的最大列是 varchar(767),但如果使用utf8,则限制为varchar(255)。 每个索引还有一个单独的3072字节限制。 767字节的限制 是每列,所以你可以包括多个列(每个767字节或 每个索引最多3072个字节,但没有列长于 767个字节。 (MyISAM有点不同。它有一个1000字节的索引 长度限制,但没有单独的列长度限制)。一 这些限制的解决方法是仅索引较长的前缀 列,但是如果要索引超过767个字节的列,该怎么办? 在InnoDB?在这种情况下,你应该考虑使用innodb_large_prefix, 这是在MySQL 5.5.14中引入的,允许您包含列 InnoDB索引中最多3072个字节。它不会影响索引 限制,仍然是3072字节。
另请参阅Mysql手册页Using Innodb_large_prefix to Avoid ERROR 1071
中的Min和Max部分答案 1 :(得分:-1)
“正确”的答案是缩短字段和/或将其标准化。
你真的有200个字符长的应用程序,型号等吗?如果没有,请缩短字段。
表中可能会重复model
重复一次?如果是这样,请对其进行标准化,并使用id
替换该列以使其标准化。
你好像在使用MyISAM;你可以(应该)也切换到InnoDB。这将改变错误信息,或者它可能会消失。
您使用的是utf8字符吗?你用英语做什么吗?更改CHARACTER SET
可能会使200 字符表示200 字节,而不是600(utf8)或800(utf8mb4)。
更改ip_address
的字符集会使其占用空间从15 *(bytes / char)缩小。因此会从CHAR
更改为VARCHAR
。另请注意,15不足以处理IPv6。