Kouhei Sutou
kou****@clear*****
2015年 10月 21日 (水) 11:55:45 JST
須藤です。 In <82216****@web10*****> "[groonga-dev,03588] loadに関して" on Wed, 21 Oct 2015 11:35:09 +0900 (JST), takah****@yahoo***** wrote: > 表題の件で御座いますが、 > 現在、mroongaを使用して、データの取り込みを行っております。 > > Perlからinsertを実行しております。 > > 本番想定では、insertする件数が2500万回程になる為、 > 速度が求められております。 1件ずつ2500万回INSERTするということですよね。 それだとオーバーヘッドが大きいので速度がでません。 速度を上げる方法は次の2つです。 * バルクインサートにする。 (1件ずつインサートするのではなくまとめてインサートする。) * 静的なインデックス構築方法を使う。 (データをインサートしながらインデックスを作るのではな く、データを全部インサートした後にインデックスを作る。) 参考: Groongaのドキュメント: http://groonga.org/ja/docs/reference/indexing.html#offline-index-construction 両方やると数十倍から数百倍から速くなっても不思議ではありませ ん。 > 別の人間からinsertでは無くて、 > groongaのloadで取り込めばという話しを頂いたのですが、 Groongaのloadは前述のバルクインサートに相当します。 MySQLでもバルクインサートする方法があります。 1つは1回のインサートで複数のVALUEを指定する方法です。 mysqldumpの結果ではこれを使っているので参考になるはずです。 INSERT INTO test VALUES (...), (...), (...); INSERTのドキュメント: https://dev.mysql.com/doc/refman/5.6/ja/insert.html もう1つはLOAD DATA INFILEを使う方法です。 LOAD DATA INFILE 'data_file' INTO TABLE test; LOAD DATA INFILEのドキュメント: https://dev.mysql.com/doc/refman/5.6/ja/load-data.html LOAD DATA INFILEの方が速いですが、サーバー上にファイルを置か ないといけなかったり少し面倒なのでまずは1回のインサートでやっ てみて十分な速度になるか確認するのがよいかと思います。 もう1つの高速化の方法の静的なインデックス構築を使うには次の ようにします。 ALTER TABLE test DISABLE KEYS; -- データをロードする。 -- INSERT INTO test VALUES ...; ALTER TABLE test ENABLE KEYS; ALTER TABLEのドキュメント: https://dev.mysql.com/doc/refman/5.6/ja/alter-table.html DISABLE KEYSでインデックスが無効になります。この状態でデータ をロードします。ロード完了後にENABLE KEYSでインデックスを有 効にすると、既存データから一気にインデックスを作ります。 DISABLE KEYSからENABLE KEYSのあいだはインデックスを使って検 索できなくなりますが、今回のケースでは検索することはないと思 うので問題ないかと思います。 どちらもやるのが一番効果がでると思いますが、たぶん、静的なイ ンデックス構築にするだけでもかなり違うと思います。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/ コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ: http://www.clear-code.com/services/code-reader/