Vous ne voulez pas d'un gigantesque gen_clust_index (Index Clustered Interne). Cette taille est immensément énorme, même pour un indice secondaire.
Vous devrez peut-être recourir à des déclencheurs ou à des procédures stockées pour vérifier la clé bien à l'avance.
Vous pouvez également penser à effectuer un appel de fonction SHA1 à l'aide du VARCHAR(3071)
champ. SHA1 renverra un champ de 40 caractères. Ce hachage peut être exactement ce dont vous avez besoin pour indexer.
Supposons que vous ayez ceci
CREATE TABLE mytable
(
id int not null auto_increment,
txt VARCHAR(3071),
primary key (id)
) ENGINE=InnODB;
et vous voulez faire un UNIQUE
index sur txt. Essayez l' approche 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;
Ensuite, comptez-les
SELECT COUNT(1) FROM mytable;
SELECT COUNT(1) FROM mytablenew;
Si les comptes sont les mêmes, FÉLICITATIONS !!! Vous avez maintenant un index unique de longueur 40. Vous pouvez terminer avec:
ALTER TABLE mytable RENAME mytableold;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;
Cela pourrait être plus atomique, comme indiqué dans les commentaires ci-dessous:
RENAME TABLE mytable TO mytableold, mytablenew TO mytable;
DROP TABLE mytableold;
Effectuez cette opération sur la table sur laquelle vous souhaitez disposer de cette grande colonne. Vous devez vous rappeler d'ajouter le SHA1 des données avec les données INSERT
.
Les chances de dupliquer les clés sont de 1 sur 2 à la puissance 160e (soit 1,4615016373309029182036848327163e + 48. Si j'obtiens le chiffre exact, je le posterai un jour).
Essaie !!!