Sie möchten keinen gigantischen gen_clust_index (Internal Clustered Index). Diese Größe ist selbst für einen Sekundärindex gottlos groß.
Möglicherweise müssen Sie frühzeitig auf Trigger oder gespeicherte Prozeduren zurückgreifen, um nach dem Schlüssel zu suchen.
Sie können auch überlegen, einen SHA1- Funktionsaufruf über das VARCHAR(3071)
Feld auszuführen . SHA1 gibt ein 40-stelliges Feld zurück. Dieser Hash ist möglicherweise genau das, was Sie zum Indizieren benötigen.
Angenommen, Sie haben dies
CREATE TABLE mytable
(
id int not null auto_increment,
txt VARCHAR(3071),
primary key (id)
) ENGINE=InnODB;
und Sie möchten einen UNIQUE
Index für txt erstellen. Probieren Sie den SHA1- Ansatz aus
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;
Dann zähle sie
SELECT COUNT(1) FROM mytable;
SELECT COUNT(1) FROM mytablenew;
Wenn die Anzahl gleich ist, HERZLICHEN GLÜCKWUNSCH !!! Jetzt haben Sie einen eindeutigen Index mit einer Länge von 40. Sie können Folgendes beenden:
ALTER TABLE mytable RENAME mytableold;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;
Dies könnte atomarer sein, wie in den Kommentaren unten ausgeführt:
RENAME TABLE mytable TO mytableold, mytablenew TO mytable;
DROP TABLE mytableold;
Führen Sie dies für jede Tabelle aus, für die Sie diese große Spalte haben möchten. Sie müssen daran denken, den SHA1 der Daten zusammen mit den Daten auf hinzuzufügen INSERT
.
Die Wahrscheinlichkeit von doppelten Schlüsseln beträgt 1 zu 2 nach der 160. Potenz (1.4615016373309029182036848327163e + 48. Wenn ich die genaue Zahl erhalte, werde ich sie eines Tages veröffentlichen).
Versuche es !!!