MySQLドキュメントは言う:
B ツリー インデックスを想定すると、テーブルのサイズによってインデックスの挿入がログ N だけ遅くなります。
これは、新しい行を挿入するたびに、挿入速度がlog Nの係数で遅くなることを意味します.Nは行数だと思いますか?すべての行を 1 つのクエリに挿入しても? すなわち:
INSERT INTO mytable VALUES (1,1,1), (2,2,2), (3,3,3), .... ,(n,n,n)
n は ~70,000 です
現在、次の構造のテーブルに約 147 万行あります。
CREATE TABLE mytable (
`id` INT,
`value` MEDIUMINT(5),
`date` DATE,
PRIMARY_KEY(`id`,`date`)
) ENGINE = InnoDB
上記の方法でトランザクションに挿入すると、コミットにかかる時間は約 275 秒です。新しいデータが毎日追加され、挿入時間が遅くなり続けるため、これを最適化するにはどうすればよいですか。
また、クエリ以外に役立つものはありますか? おそらくいくつかの構成設定?
考えられる方法 1 - インデックスの削除
挿入の直前にインデックスを削除すると、挿入速度が向上する可能性があることを読みました。挿入後、再度インデックスを追加します。しかし、ここでは唯一のインデックスは主キーであり、私の意見では、それを削除してもあまり役に立ちません。また、主キーが削除されている間は、すべての選択クエリが非常に遅くなります。
私は他の可能な方法を知りません。
編集:〜147万行のテーブルに〜60,000行を挿入するいくつかのテストを次に示します。
上記の単純なクエリを使用した場合: 146 秒
MySQL の LOAD DATA infile の使用: 145 秒
MySQL の LOAD DATA infile を使用し、David Jashi の回答で提案されているように csv ファイルを分割します。それぞれ 1000 行の 60 ファイルで 136 秒、それぞれ 10,000 行の 6 ファイルで 136 秒
主キーの削除と再追加:キーの削除には 11 秒、データの挿入には 0.8 秒かかりましたが、主キーの再追加には 153 秒、合計で 165 秒かかりました