在我的MySQL数据库中,我有一个字符串列(例如,一个SHA哈希),它增长太长而无法建立索引。如何针对此列运行高效查询?
N
字符上放置一个索引,但是那个使用这个“部分”索引的查询是什么样的?N
个字符的第二列,并在其上放置一个完整的索引,作为“部分”索引的代理。然后我会查询,获取一个或多个记录,并在内存中执行过滤的最后一步。 在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字节。
答案 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))
使用最后一个参数。