Answers:
您不需要巨大的gen_clust_index(内部聚簇索引)。即使对于二级索引,该大小也非常庞大。
您可能需要借助触发器或存储过程来提前检查密钥。
您也可以考虑使用该字段执行SHA1函数调用VARCHAR(3071)
。SHA1将返回一个40个字符的字段。此哈希可能正是您需要索引的内容。
假设你有这个
CREATE TABLE mytable
(
id int not null auto_increment,
txt VARCHAR(3071),
primary key (id)
) ENGINE=InnODB;
而您想UNIQUE
在txt上建立索引。尝试SHA1方法
CREATE TABLE mytablenew LIKE mytable;
ALTER TABLE mytable ADD txtsha1 CHAR(40);
ALTER TABLE mytable ADD UNIQUE KEY (txtsha1);
INSERT INTO mytablenew (id,txt,txtsha1)
SELECT id,txt,SHA1(txt) FROM mytable;
然后算一下
SELECT COUNT(1) FROM mytable;
SELECT COUNT(1) FROM mytablenew;
如果计数相同,恭喜!!!现在,您有了一个长度为40的唯一索引。您可以完成以下操作:
ALTER TABLE mytable RENAME mytableold;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;
如下面的评论所指出的那样,这可能更具原子性:
RENAME TABLE mytable TO mytableold, mytablenew TO mytable;
DROP TABLE mytableold;
在打算使用此大列的任何表上执行此操作。您必须记住要添加数据的SHA1和上的数据INSERT
。
重复键的几率是160的2分之一(即1.4615016373309029029182036848327163e + 48。如果我得到确切的数字,则有一天会发布它)。
试试看 !!!