この問題は、テーブルを作成し、インデックスを作成して、問題を忘れるだけではないことがわかりました:)他の誰かが同じ問題に直面した場合に備えて、これが私がしたことです(IPアドレスの例を使用しましたが、他の問題でも機能しますデータ型も):
問題:テーブルに数百万のエントリがあり、インデックスを非常に高速に追加する必要があります
ユースケース: ルックアップテーブルに数百万のIPアドレスを格納することを検討してください。 IPアドレスの追加は大きな問題ではありませんが、IPアドレスのインデックスの作成には14時間以上かかります。
解決策 :MySQLのPartitionin を使用してテーブルを分割します g戦略
ケース#1:必要なテーブルがまだ作成されていない場合
CREATE TABLE IPADDRESSES(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;
ケース#2:必要なテーブルがすでに作成されている場合。 これを行うためにALTERTABLEを使用する方法があるようですが、私はまだこれに対する適切な解決策を見つけていません。代わりに、少し非効率的な解決策があります:
CREATE TABLE IPADDRESSES_TEMP(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id)
) ENGINE=MYISAM;
このテーブルにIPアドレスを挿入します。次に、パーティションを使用して実際のテーブルを作成します。
CREATE TABLE IPADDRESSES(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;
そして最後に
INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
DROP TABLE IPADDRESSES_TEMP;
ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)
そして、あなたは行きます...新しいテーブルでのインデックス作成には、1GBのRAMを搭載した3.2GHzのマシンで約2時間かかりました:)これがお役に立てば幸いです。