web-dev-qa-db-ja.com

mysqlは何百万ものレコードをより速く挿入できますか?

私はデータベースに数百万件のレコードを挿入したかったのですが、1時間あたり約40,000件の記録で非常に遅くなりました。さまざまな.sqlファイルに分離された多くのテーブルがあります。 1つのレコードも非常に単純で、1つのレコードの列数は15未満で、1つの列の文字数は30未満です。 mysql 5.3でarchlinuxの下でこの仕事をしました。アイデアはありますか?または、この速度は遅くありませんか?

19
Cricket

次のようなレコードを挿入している可能性が最も高いです。

INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");

INSERTが必要になるたびに新しいクエリを送信すると、何か問題があります。代わりに、このようにすべてのクエリを1つのクエリに結合するだけです。

INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2");

MySQL Docs で挿入速度の詳細を読むこともできます。次のことを明確に説明しています。

挿入速度を最適化するには、多数の小さな操作を1つの大きな操作に結合します。理想的には、単一の接続を確立し、一度に多くの新しい行のデータを送信し、すべてのインデックスの更新と一貫性チェックを最後まで遅らせます。

もちろん、金額が膨大な場合、それらすべてを組み合わせないでください。挿入する必要がある行が1000行あるとします。一度に1行は実行しないでください。ただし、1つのクエリで1000行すべてを等しくしようとするべきではありません。代わりに、より小さいサイズに分割します。

それでも本当に遅い場合は、サーバーが遅いためである可能性があります。

もちろん、複合クエリでこれらすべてのスペースが必要なわけではないことに注意してください、それは単に答えのより良い概要を得るためです。

35
Vallentin