「覚え間違い」を教えてください!

タイトルの件について、分かる方おりましたらどなたかご教授ください。

[DBサーバ]
Linux CentOS 6.4
CPU Xeon core4
SSD 250GB
RAM 32GB

バージョン情報
MySQL 5.5
tomcat 6
JDK 6

会員データをCSVから大量にUSERテーブルへINSERTする処理を行っています。
また、それに関連するデータも同時にINSERTをします。 (USER_ID を持っている SERVICE_POINTテーブルやADDRESSテーブル)
処理の流れとしては以下となります。


(1) 会員情報の入ったCSVファイルをサーバへアップロード

(2) 1でアップロードしたCSVファイルを○○○○件毎に一時ファイルに切り分ける

~~ ここからバックグラウンドで実行 ~~
(3) 2で切り分けたファイルをループで回しながら、メアドの重複やフォーマットエラーなどを判定する

(4) 3でエラーがあれば即座にERRORSテーブルにエラー詳細をINSERTし、コミット&continue;

(5) 3でエラーがなければUSERテーブル・SERVICE_POINTテーブル・ADDRESSテーブルへINSERT処理

(6) その他関連するテーブルへUPDATE処理

(7) 3に戻る



ストレージエンジンは全てInnoDBです。
my.cnfのInnoDBの設定は以下の通りです。


innodb-buffer-pool-size = 24G
innodb-log-buffer-size = 8M
innodb-log-file-size = 1024M
innodb_log_files_in_group = 3
innodb_fast_shutdown = 0
innodb_data_file_path = ibdata1:10M:autoextend
innodb_file_io_threads = 4
innodb_change_buffering = all
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 2
innodb_max_dirty_pages_pct = 90
innodb_flush_method = O_DIRECT
innodb_lock_wait_timeout = 120
innodb_additional_mem_pool_size = 128M
innodb_file_format = Barracuda
innodb_file_per_table = 1


なお、ERRORSテーブルのINSERTは非常に速いです。
会員数が全くない状態だとスムーズに登録されていくのですが (1秒に15件程度)
テーブルが肥大化して20万件を超えると1秒に1件ほどしかINSERTされません。
この速度を少しでも速くしたいなと思っています。

1件ずつコミットしているのには理由があります。
ただ、1000件ずつコミットしても速度はほぼ変わりませんでした。

こういう場合、やはりパーティショニングを検討しなければならないでしょうか。
よろしければどなたかご教授ください。

以上、よろしくお願いいたします。

A 回答 (1件)

1レコードにどのくらいの容量があるかにもよりますが


csvを一度テンポラリに保存して
重複チェックなどはテーブル同士のリレーションでおこない
エラーのものはエラーテーブルに吐きだして削除し
残ったテンポラリのテーブルを結合しながら他のユーザーテーブルなどに
吐きだしていくとそれなりに速くなると思います
    • good
    • 0
この回答へのお礼

なるほど、そういう方法もあるのですね。
テンポラリに保存して結合していくやり方は試してませんでしたので、それをしてみます。

大変参考になりました、ありがとうございます。

お礼日時:2014/02/07 10:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報