mysql:8114
From: 伊藤 恵吾 <伊藤 恵吾 <k5_ito@xxxxxxxxxx>>
Date: Thu, 7 Aug 2003 18:47:38 +0900 (JST)
Subject: [mysql 08114] Re: InnoDB への大量 INSERT ,高速化
アドバイスを頂いた皆様: 皆さんのお陰で大幅に高速化することができました。 ありがとうございました。 キーポイントとなったのは、 「innodb_buffer_pool_size」と、 「set autocommit=0;」です。 (どちらが効果をもたらしたのかは不明です。) 以下、考察です。 「7.6.9 Performance tuning tips」 http://www.mysql.gr.jp/jpdoc/3.23.x/manual.ja_Table_types.html#InnoDB_Consistent_read_example より以下、抜粋。 1. もし Unix `top' や Windows `Task Manager' が CPU 使用 率を 70% 未満に表示している場合、おそらく、disk アクセス に処理が取られています。とても多くのトランザクションのコ ミットを作成しているか、バッファプールが小さいのでしょう 。バッファプールを大きくすれば良くなりますが、しかし、バ ッファプールは物理メモリの 80% より大きくしないように。 → /etc/my.cnf で set-variable = innodb_buffer_pool_size=64M を指定した。 7. InnoDB にデータを流し込む場合には、 MySQL の設定が autocommit=1 になっていないようにします。それぞれの全ての insert が log をディスクにフラッシュすることを要求するからです。取り込 む SQL の最初に set autocommit=0; を追加し、最後に commit; を書きます。 → set autocommit=0; commit; を追加した。 ↓ 今まで10時間以上かかっていたものが、2時間50分ほどで完了 するようになりました。 アドバイス、誠にありがとうございました。 --- Tatsuhiko Miyagawa <miyagawa@xxxxxxxxxx> からのメッ セージ: > 宮川です。 > > At Thu, 7 Aug 2003 14:07:05 +0900 (JST), > 伊藤 恵吾 wrote: > > > 毎回commitしているのでは? > > > > 1000回insertしたら1回commitなんて感じでやれば早くなり> > ます. > > > > > > 外してたらごめんちゃい > > > > 1000個のVALUE > を一度にINSERTしています。具体的にはこうで > > す。 > > > > LOCK TABLES foo WRITE; > > INSERT INTO foo VALUES > > (f1, ...), > > (f2, ...), > > .... > > (f1000, ...); > > UNLOCK TABLES; > > SET autocommit=0; > INSERT INTO ..: > COMMIT; > > ではどうでしょうか? > > > -- > Tatsuhiko Miyagawa <miyagawa@xxxxxxxxxx>
8108 2003-08-07 11:29 [伊藤 恵吾 <k5_ito@xx] InnoDB への大量 INSERT ,高速化 8109 2003-08-07 12:00 ┣[hironaka <hironaka@x] 8110 2003-08-07 13:57 ┃┣[ken <t_takahashi@xxx] 8111 2003-08-07 14:07 ┃┗[伊藤 恵吾 <k5_ito@xx] 8113 2003-08-07 14:27 ┃ ┗[Tatsuhiko Miyagawa <] -> 8114 2003-08-07 18:47 ┃ ┗[伊藤 恵吾 <k5_ito@xx] 8112 2003-08-07 14:25 ┗[SUGAWARA Hajime <sug]