MySQL创建索引错误

时间:2016-02-11 11:26:46

标签: mysql django indexing

问题是为表' visits_visit'创建索引。 (Django访问app),因为每个查询持续至少60毫秒,并且会更糟。

enter image description here

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

怎么办?表的结构在屏幕截图上。

2 个答案:

答案 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。