MySQL:列上的高效查询太长而无法编制索引

时间:2013-08-20 20:43:45

标签: mysql sql

在我的MySQL数据库中,我有一个字符串列(例如,一个SHA哈希),它增长太长而无法建立索引。如何针对此列运行高效查询?

  • 我可以在列的第一个N字符上放置一个索引,但是那个使用这个“部分”索引的查询是什么样的?
  • 我可以创建一个带有N个字符的第二列,并在其上放置一个完整的索引,作为“部分”索引的代理。然后我会查询,获取一个或多个记录,并在内存中执行过滤的最后一步。
  • 我可以使用full text search functions,但我需要使用MyISAM。 MyISAM不支持ACIDity,因此不,谢谢。

在MySQL中实现这一目标的正确方法是什么?

如果配置的密钥长度太短,问题不在于减小列的大小或重新配置数据库。它是关于利用部分索引或类似的东西,最好不会给应用程序带来负担或弹出额外的列。

在我的特定情况下,我在UTF8表中的两列上寻找复合键:

create table fingerprinted_item (
  type varchar (512) not null,
  fingerprint varchar (512) not null,
  primary key (fingerprint, type)
);

-- Then there may be a child table.

MySQL说:

[42000][1071] Specified key was too long; max key length is 767 bytes

在另一台服务器上,最大密钥长度为1000字节。

2 个答案:

答案 0 :(得分:3)

真正的问题可能是使用VARCHAR指纹列。当使用utf8字符编码时,MySQL强制执行“最坏情况”并且每个字符计算3个字节。

将其更改为1字节编码(例如Latin1),或改为使用VARBINARY类型:

create table fingerprinted_entry 
( type varchar (128) not null, 
  fingerprint varbinary (512) not null,
  PRIMARY KEY(type, fingerprint)) ENGINE InnoDB; -- no error here

如果必须超出每个前缀的767字节限制,则必须显式声明创建索引时:

create table fingerprinted_entry 
( type varchar (128) not null, 
  fingerprint varbinary (2048) not null,              -- 2048 bytes
  PRIMARY KEY(type, fingerprint(767))) ENGINE InnoDB; -- only the first 767 bytes of fingerprint are stored in the index

答案 1 :(得分:2)

http://bugs.mysql.com/bug.php?id=6604

试试这个:

ALTER TABLE `mytable` ADD UNIQUE ( yourcolumn(1000))

使用最后一个参数。