MySQL错误:指定密钥太长;最大密钥长度为1000字节

时间:2011-02-11 21:31:45

标签: mysql phpmyadmin key

还有一些关于此错误的其他问题,但我很难解决这个问题。

我正在尝试制作一个非常基本的MySQL表。我试图在utf8中保留每一个东西,我理解它比普通的char集需要更多的字节。

CREATE TABLE `bibliography` (
  `id` int(5) unsigned zerofill NOT NULL,
  `pub_type` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pub_genre` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `author_first` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `author_last` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `publication` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pub_date` date NOT NULL,
  `pub_city` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pub_country` varchar(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `html` text NOT NULL,
  `live` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `pub_type` (`pub_type`,`pub_genre`,`title`,`author_first`,`author_last`,`publication`,`pub_date`,`pub_city`,`pub_country`),
  KEY `live` (`live`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

好的,以上作品,但显然我不能生活5个角色的作者名字。当我试图提高限额时:

ALTER TABLE `bibliography` CHANGE `author_first` `author_first` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL 

我收到错误:

  

1071 - 指定的密钥太长;最大密钥长度为1000字节

所以,我不明白。 1000字节限制是否适用于整个表格?显然它确实如此,对吧?

根据答案,有人可以告诉我设置索引之间的区别,如:

KEY `live` (`live`),
  KEY `pub_type` (`pub_type`),
  KEY `pub_genre` (`pub_genre`),
  KEY `author_last` (`author_last`),
  KEY `publication` (`publication`) 

并且喜欢:

KEY `pub_type` (`pub_type`,`pub_genre`,`title`,`author_first`,`author_last`,`publication`,`pub_date`,`pub_city`)

我开始在这里理解,KEY限制为1000字节。但是你可以在表格中有多个键。如何将一堆字段组合成一个不同的密钥形式,为每个不同的字段分配一个密钥?

2 个答案:

答案 0 :(得分:8)

不,它不适用于整个表格。但是,您正在使用每个字符需要最多 3个字节的unicode字段,因此包含VARCHAR(50) unicode字段的密钥在MySQL中转换为150个字节。所以,你的总数是:

KEY `pub_type` (
    `pub_type`, 5
    `pub_genre`, 5
    `title`, 255
    `author_first`, 5
    `author_last`, 5
    `publication`, 5
    `pub_date`, 3 bytes
    `pub_city`, 5
    `pub_country`5 
)

= 7*5 + 255 = 290 * 3 = 870 + 3 = 873 bytes。 您只需展开1000 - 873 = 127个字节,这意味着您可以扩展字段大约127 / 3 = 42个字符。不是一个安全的赌注。

您使用的索引(键)错误。每个领域都有一个索引是没有意义的。如果您正在尝试加快查询速度,请仅包含WHERE子句中最常用的字段。

答案 1 :(得分:1)

将pub_type键更改为仅包含pub_type,pub_genre和title。可能的情况是,此密钥几乎与您当前用于加速查询的密钥一样好,并且可以让您拥有较长的作者姓名等,而不会违反表格的最大密钥长度限制。