Haruka Yoshihara
yoshi****@clear*****
2012年 6月 20日 (水) 18:00:35 JST
吉原です。 > 当方では現行システムの検索性能向上のため > MYSQL⇒groongaへの移行を進めているのですが、 > 仕様等の理由からgroongaへの移行が困難な状況です。 そうですか。。。 もし可能であればでよいのですが、どのあたりが問題になったのか を教えて頂けると今後の開発の参考とすることができて助かります。 よろしければご検討ください。 > そこで確認したいのですが、 > groongaテーブルに移行した場合の検索性能と、 > 既存MYSQLテーブルで、検索エンジンでmroongaを使用した場合の > 検索性能とでは、大きく違うものでしょうか? > > 大雑把な質問で申し訳ありません。 > データ量、結合の度合いなどで変わるかとは思いますが、 > ご回答いただけると助かります。 はい、たしかにデータ量などで変わります。 最新のgroonga/mroongaを用いたものではなく、2011年10月頃の groonga/mroongaを用いたものなのですが、ベンチマーク結果がある のでそれをご紹介します。ただし、全文検索(MATCH AGAINST)の 性能ではなく、位置情報検索(MBRContains)の性能を測定したも のなので、全文検索だとまた傾向が違うかもしれないことに注意し てください。また、できるだけ正確になるように計測したものでは なく、傾向を確認するために計測したものであることにも注意して ください。 ○ 概要 * データの登録性能はgroongaの方がmroongaよりもよい。これは SQL解釈などのオーバーヘッドによるもの。 * 検索性能はORDER BYがあるとgroongaが速く、ないとmroongaの 方が速い。ただ、ヒット数が少ないとそんなに変わらないかも しれない。 ○ 登録性能について データは国土地理院の位置参照情報ダウンロードサービスからダウ ンロードした2010年度のデータを利用しています。約1100万レコー ドあります。 http://nlftp.mlit.go.jp/isj/ これの登録にかかった時間は以下の通りです。 groonga | mroonga | mroonga | MyISAM | | データ書き込みなし | -------------------------------------------------- 3分29秒 | 11分53秒 | 8分38秒 | 15分54秒 ここからわかることは以下の通りです。 * groongaに直接データを登録するのが一番速い * groongaとmroongaの登録性能の差はMySQLのレイヤーのオーバー ヘッドによる。 * 「mroongaデータ書き込みなし」と「mroonga」の処理の違い はgroongaに実際にデータを登録するかどうかである。この 時間差を確認すると、3分15秒である。これはgroongaに直接 データを登録する時間(3分29秒)とほぼ一致する。つまり、 「mroongaデータ書き込みなし」にかかる時間がMySQLのレイ ヤーのオーバーヘッドであるといえる。 * groongaでもmroongaでもMyISAMより速い。 なお、「mroonga + InnoDB」というようにラッパーモードで計測し た場合は42分33秒になりました。InnoDBは位置情報検索をサポート していないためInnoDB単体の計測結果はないのですが、一般的にラッ パーモードで使った場合はラップしているストレージエンジン(こ の場合はInnoDB)の性能とほぼ同等になるようです。これは、 mroongaがgroongaのインデックスを構築する時間はほとんど無視で きそうということです。 ○ 検索性能について 以下のような検索を1000回実施した場合の検索時間です。たしか、 ヒット数が多かった気がするので、多くの場合はこれよりも速く結 果が返るはずです。 位置情報で絞り込んでヒットしたレコードのカラムで並び替えて 先頭10件を取得する。「特定のエリア内にある人気のお店を10件 取得する」というようなストーリーを想定。ただし、特定のエリ アが結構広めなのでヒット件数が多かったはず。 SQLでいうと WHERE MBRContains(...) ORDER BY ... LIMIT 10 groonga | mroonga | MyISAM | mroonga | | | + InnoDB ---------------------------------------- 6分45秒 | 20分51秒 | 22分27秒 | 28分8秒 ここからわかることは以下の通りです。 * groongaが速い。 * カラムストアなので、特定のカラムに対するORDER BYが高速 に実行できるためと考えられる。 * ストレージエンジンの中ではmroongaが速い。 なお、ORDER BYをなくすとgroonga以外は0秒以下(100ミリ秒など) で完了します。groongaは4分37秒かかりました。これは、MySQLを 使った場合は見つかった順に結果を返しているのに対して、 groongaでは一度すべての検索結果を揃えてから結果を返している からです。見つかった順に結果を返すと先頭10件ヒットした段階で 検索を終了できますが、すべての検索結果を揃える場合はそうしま せん。そのあたりが速度の差になっています。 現実的には、人気順や特定の地点からの距離などでソートすること が多いはずなのでORDER BYはあることの方が多いと考えられます。 直接使える結果ではないとは思いますが、参考にしていただければ と思います。 よろしくお願いいたします。 -- 吉原 陽香 <yoshi****@clear*****>