Non vuoi un gen_clust_index gigantesco (indice cluster interno). Quella dimensione è immensamente enorme anche per un indice secondario.
Potrebbe essere necessario ricorrere a trigger o stored procedure per verificare la chiave con largo anticipo.
Si potrebbe anche pensare di eseguire una chiamata di funzione SHA1 utilizzando il VARCHAR(3071)
campo. SHA1 restituirà un campo di 40 caratteri. Questo hash potrebbe essere proprio quello che devi indicizzare.
Supponi di avere questo
CREATE TABLE mytable
(
id int not null auto_increment,
txt VARCHAR(3071),
primary key (id)
) ENGINE=InnODB;
e vuoi fare un UNIQUE
indice su txt. Prova l' approccio 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;
Quindi contali
SELECT COUNT(1) FROM mytable;
SELECT COUNT(1) FROM mytablenew;
Se i conteggi sono gli stessi, CONGRATULAZIONI !!! Ora hai un indice univoco di lunghezza 40. Puoi finire con:
ALTER TABLE mytable RENAME mytableold;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;
Questo potrebbe essere più atomicamente, come sottolineato nei commenti qui sotto:
RENAME TABLE mytable TO mytableold, mytablenew TO mytable;
DROP TABLE mytableold;
Esegui questo su qualunque tabella tu intenda avere questa grande colonna. Devi ricordare di aggiungere SHA1 dei dati insieme ai dati su INSERT
.
La probabilità di chiavi duplicate è 1 su 2 alla 160a potenza (quella 1.4615016373309029182036848327163e + 48. Se ottengo la cifra esatta, la posterò un giorno).
Provaci !!!