-
2020-05-19 PostgreSQL全文検索
PostgreSQL の全文検索モジュール pg_bigm と PGroonga の速度比較(1)
PostgreSQLで全文検索を行う場合、全文検索用の機能拡張モジュールであるPGroongaやpg_bigmを仕様するのが効率的です。両方とも性能面や機能面、使い方などに違いがあります。各モジュールの特性や使い方をきちんと理解することで全文検索の効率を大幅に向上させることが出来るでしょう。
はじめに
みなさん、こんにちは。インサイトの梅宮です。
今回はインサイト技術ブログ最初の記事としてPostgreSQLの全文検索エンジンであるPGroongaとpg_bigmの性能差比較を検証してみたので、それぞれのモジュールの簡単な説明とともに紹介したいと思います。
詳しい機能や内部動作に関しましてはこちらのブログに書いておりますので、より深くPGroongaに触れたい方はご覧いただければと思います。
※2022/03/30 に追加検証を行っています。
PostgreSQL の全文検索モジュール pg_bigm と PGroonga の速度比較(2)
PGroongaとは?
PGroongaはGroonga(参考記事参照)という全文検索エンジンを使用して実行できるPostgreSQLの全文検索用機能拡張モジュールです。
数多くの関数や機能を搭載しており汎用性に優れています。
pg_bigmって?
pg_bigmはPostgreSQLに文字列の中間一致検索に使えるGIN方式のインデックスを提供するオープンソースの拡張機能です。特にB-treeインデックスを適用できない問い合わせを高速化することが出来ます。
効果的な導入事例
・データ量が多いテーブルに対して問い合わせをする場合
・頻繁にアクセスがあり1回あたりの検索処理を減らしたい場合
PGroongaとpg_bigmの性能比較
検証環境
サイズ:655MB
レコード数:約24万件
平均バイト数:約2.3KiB
最大バイト数:約3.3KiB
検証方法
- pg_bigmを使用したの2文字検索、3文字検索とPGroongaを使用した2文字検索、3文字検索の実行時間を比較
#実行SQL
EXPLAIN ANALYZE SELECT カラム名 FROM テーブル名 WHERE インデックス名 like '%文字列%';
- PGroongaには専用の『&@』という特殊な演算子を使って検索することもできるのでこちらについても比較してみる。
- 『&@』演算子を使用することによってRecheckなしで動く
※PGroongaはpostgreSQLに保存しているインデックス対象のテキストも保存しているため誤検出が起こらない。
#実行SQL
EXPLAIN ANALYZE SELECT カラム名 FROM テーブル名 WHERE インデックス名 &@ '文字列';
- 検索をするたびにPostgreSQLの再起動とキャッシュクリアを行う
検証結果
※ pg_bigm、PGroonga ともに実行時間が数十秒となっているのは、ディスクアクセスの時間が含まれているためです。
※ PGroongaとpg_bigmのインデックスの大きさ
PGroonga:2053MB
pg_bigm:797MB
まとめ
本検証の結果をまとめると、
・2文字検索に関してはPGroongaもpg_bigmも大きな差はない。
・3文字検索に関してはPGroongaが圧倒的に速い(約3倍)。
・PGroongaでLIKE検索をするとパフォーマンスが上がらないので特殊演算子『&@』を使用する。
・PGroongaは高速化のために大きなインデックスを作成しているが、作成速度はpg_bigmの半分弱程度(本家サイト参照)。
・インデックス作成速度はPGroongaの方が速いが、PGroongaはインデックス分の容量を取るため注意が必要。
以上がPGroongaとpg_bigmの性能差として明らかとなりました。
終わりに
今回はPostgreSQLのパフォーマンスチューニングとして全文検索高速化を記事として書かせていただきました。2文字の検索に強いpg_bigmですが、3文字以上の検索にも対応しており、多機能で汎用性に優れたPGroongaの方が実用的・業務向ではあるのかもしれませんね。PGroongaの各機能と関数は公式ドキュメントに詳しく記載されています。
今後もPostgreSQLのパフォーマンスチューニングを始めとした技術情報や検証結果を発信していきます!
弊社お問い合わせフォーム
https://www.insight-ltd.co.jp/contact/
参考記事
https://pgroonga.github.io/ja/
https://groonga.org/ja/
https://www.sraoss.co.jp/tech-blog/pgsql/pg_bigm/
https://pgroonga.github.io/ja/reference/pgroonga-versus-pg-bigm.html