No desea un gen_clust_index gigantesco (índice agrupado interno). Ese tamaño es impío enorme incluso para un índice secundario.
Es posible que tenga que recurrir a disparadores o procedimientos almacenados para verificar la clave con mucha anticipación.
También podría pensar en realizar una llamada de función SHA1 usando el VARCHAR(3071)
campo. SHA1 devolverá un campo de 40 caracteres. Este hash puede ser justo lo que necesita indexar.
Supongamos que tienes esto
CREATE TABLE mytable
(
id int not null auto_increment,
txt VARCHAR(3071),
primary key (id)
) ENGINE=InnODB;
y quieres hacer un UNIQUE
índice en txt. Prueba el enfoque 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;
Entonces, cuéntales
SELECT COUNT(1) FROM mytable;
SELECT COUNT(1) FROM mytablenew;
Si los recuentos son iguales, ¡¡¡FELICIDADES !!! Ahora tiene un índice único de longitud 40. Puede terminar con:
ALTER TABLE mytable RENAME mytableold;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;
Esto podría ser más atómicamente como se señala en los comentarios a continuación:
RENAME TABLE mytable TO mytableold, mytablenew TO mytable;
DROP TABLE mytableold;
Realice esto en cualquier tabla que desee tener esta gran columna. Debe recordar agregar el SHA1 de los datos junto con los datos sobre INSERT
.
La probabilidad de duplicar claves es de 1 en 2 a la potencia 160 (que 1.4615016373309029182036848327163e + 48. Si obtengo la cifra exacta, la publicaré algún día).
Darle una oportunidad !!!