TECH BLOG
技術ブログ

ARTICLE

  • 2020-05-19 DBチューニング

    全文検索モジュール、pg_bigmとPGroongaの性能を比較してみた

はじめに

みなさん、こんにちは。インサイトの梅宮です。
今回はインサイト技術ブログ最初の記事としてPostgreSQLの全文検索エンジンであるpg_bigmとPG_roongaの性能差比較を検証してみたので、それぞれのモジュールの簡単な説明とともに紹介したいと思います。

pg_bigmって?

pg_bigmはPostgreSQLに文字列の中間一致検索に使えるGIN方式のインデックスを提供するオープンソースの拡張機能です。特にB-treeインデックスを適用できない問い合わせを高速化することが出来ます。

効果的な導入事例

・データ量が多いテーブルに対して問い合わせをする場合
・頻繁にアクセスがあり1回あたりの検索処理を減らしたい場合

PGroongaとは?

PGroogaはGroongaというインデックスを使った全文検索の拡張機能です。直観的な使用方法はpg_bigmと同様ですがpg_bigmと比べて検索速度や機能面で大幅に優れていると言われています。

pg_bigmとPGroogaの性能比較

検証環境

サイズ:655MB
レコード数:約24万件
平均バイト数:約2.3KiB
最大バイト数:約3.3KiB

検証方法
  1. pg_bigmを使用したの2文字検索、3文字検索とPGroongaを使用した2文字検索、3文字検索の実行時間を比較
 #実行SQL
 EXPLAIN ANALYZE SELECT カラム名 FROM テーブル名 WHERE インデックス名 like '%文字列%';
  1. PGroongaには専用の『&@』という特殊な演算子を使って検索することもできるのでこちらについても比較してみる。
    • 『&@』演算子を使用することによってRecheckなしで動く
 #実行SQL
EXPLAIN ANALYZE SELECT カラム名 FROM テーブル名 WHERE インデックス名 &@ '文字列';
  1. 検索をするたびにPostgreSQLの再起動とキャッシュクリアを行う
検証結果

※pg_bigmとPGroongaのインデックスの大きさ
pg_bigm:797MB
PGroonga:2053MB

まとめ

本検証の結果をまとめると、
・2文字検索に関してはpg_bigmもPGroongaも大きな差はない。
・3文字検索に関してはPGroongaが圧倒的に速い(約3倍)。
・PGroongaでLIKE検索をするとパフォーマンスが上がらないので特殊演算子『&@』を使用する。
・PGroongaは高速化のために大きなインデックスを作成しているが、作成速度はpg_bigmの半分弱程度(本家サイト参照)
以上がpg_bigmとPGroongaの性能差として明らかとなった。

終わりに

今回はPostgreSQLのパフォーマンスチューニングとして全文検索高速化を記事として書かせていただきました。2文字以下の検索に強いpg_bigmですが、3文字以上の検索にも対応しており、多機能で汎用性に優れたPGroongaの方が実用的・業務向ではあるのかもしれませんね。PGroongaの各機能と関数は公式ドキュメントに詳しく記載されています。
今後もPostgreSQLのパフォーマンスチューニングを始めとした技術情報や検証結果を発信していきます!

参考記事

https://pgroonga.github.io/ja/
https://www.sraoss.co.jp/tech-blog/pgsql/pg_bigm/
(https://pgroonga.github.io/ja/reference/pgroonga-versus-pg-bigm.html)

CATEGORY

ARCHIVE

データベースの
パフォーマンス・チューニングのご相談は
株式会社インサイトまで
お気軽にお問い合わせください。

CONTACT