14億レコードのテーブルがあります。テーブルの構造は次のとおりです。
CREATE TABLE text_page (
text VARCHAR(255),
page_id INT UNSIGNED
) ENGINE=MYISAM DEFAULT CHARSET=ascii
要件は、列にインデックスを作成することtext
です。
テーブルサイズは約34Gです。
次のステートメントでインデックスを作成しようとしました。
ALTER TABLE text_page ADD KEY ix_text (text)
10時間待った後、ようやくこのアプローチをやめました。
この問題に対して実行可能な解決策はありますか?
UPDATE:テーブルが更新、挿入、または削除されることはほとんどありません。列にインデックスを作成する理由text
は、この種のSQLクエリが頻繁に実行されるためです。
SELECT page_id FROM text_page WHERE text = ?
更新:テーブルをパーティション分割することで問題を解決しました。
テーブルは、列で40個に分割されていますtext
。その後、テーブルにインデックスを作成すると、完了するまでに約1時間かかります。
テーブルのサイズが非常に大きくなると、MySQLインデックスの作成が非常に遅くなるようです。また、パーティション化により、テーブルがより小さなトランクに縮小されます。
CREATE INDEX
ステートメントを使用することの何が問題になっていますか?