长字符串的MySQL索引

时间:2011-06-26 21:01:54

标签: mysql

我有MySQL InnoDb表,我希望存储长(限制为20k符号)字符串。有没有办法为这个字段创建索引?

3 个答案:

答案 0 :(得分:8)

您可以将该字段的MD5索引到另一个字段并将其编入索引。那么当你搜索你的匹配与未编入索引的完整字段和md5字段时。

答案 1 :(得分:3)

您需要限制索引的长度,否则您可能会获得error 1071(“指定密钥太长”)。 CREATE INDEX上的MySQL手册条目描述了这一点:

  

可以创建仅使用列值的前导部分的索引,使用col_name(length)语法指定索引前缀长度:

     
      
  • 可以为CHAR,VARCHAR,BINARY和VARBINARY列指定前缀。

  •   
  • BLOB和TEXT列也可以编入索引,但必须给出前缀长度。

  •   
  • 前缀长度以非二进制字符串类型的字符形式给出,以字节为二进制字符串类型。也就是说,索引条目包含CHAR,VARCHAR和TEXT列的每个列值的第一个长度字符,以及BINARY,VARBINARY和BLOB列的每个列值的第一个长度字节。

  •   

它还添加了这个:

  

前缀支持和前缀长度(支持的位置)取决于存储引擎。例如,对于MyISAM表,前缀最长可达1000字节,对于InnoDB表,前缀最长可为767字节。

答案 2 :(得分:0)

这里是一个示例,说明了如何执行此操作。正如@Gidon Wise在他的答案中提到的那样,您可以为附加字段建立索引。在这种情况下,它将是query_md5

CREATE TABLE `searches` (
  `id` int(10) UNSIGNED NOT NULL,
  `query` varchar(10000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `query_md5` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
) ENGINE=InnoDB;

ALTER TABLE `searches`
  ADD PRIMARY KEY (`id`),
  ADD KEY `searches_query_md5_index` (`query_md5`);

要确保您没有任何类似的md5哈希,请执行and `query` =''仔细检查。 查询将如下所示:

select * from `searches` where `query_md5` = "b6d31dc40a78c646af40b82af6166676" and `query` = 'long string ...'

b6d31dc40a78c646af40b82af6166676long string ...字符串的md5哈希。我认为这可以提高查询性能,并且可以确保获得正确的结果。