0

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

  • 我可以在列的第一个字符上放置一个索引N,但是使用这个“部分”索引的查询是什么样的呢?
  • 我可以创建带有N字符的第二列并在其上放置一个完整索引,作为“部分”索引的代理。然后我会查询,获取一条或多条记录,然后在内存中执行最后一步过滤。
  • 我可以使用全文搜索功能,但是我需要使用 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 字节。

4

2 回答 2

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
于 2013-08-20T21:09:12.207 回答
2

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

尝试这个:

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

玩弄最后一个参数。

于 2013-08-20T21:05:33.803 回答