回答:
巨大な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
。
重複するキーのオッズは2分の1から160乗です(その1.4615016373309029182036848327163e + 48。正確な数値が得られれば、いつか投稿します)。
試してみる !!!