PostgreSQLのLIKE部分一致でINDEXが効かない対応
PostgreSQLでインデックスを設定したカラムに対し、LIKE演算子を使って「部分一致('〇〇%')」で取得しようとしたが、INDEXが機能しない。
create index on m_user (name)
Indexの対象はユーザーマスタテーブルの「name」カラム。
WHERE句でカラムに対し「=(イコール)」条件による実行だと、Index Scan(索引兼検索)が行われている。が、
LIKE演算子の部分一致で実行すると、何故かSeq Scan(フルスキャン)で参照している。後方一致or部分一致ならわかるが、これがどうしたものか・・・。
上記にテキスト検索によるインデックスの動きが紹介されていた。ふむふむ。
普通のインデックス (btree) を作成します。ただし、注意点が幾つかあります。 Cロケールを使う インデックスを使えるのはロケールがCの場合に限られます。
・・・らしい。
日本語のロケールを使用した場合は、 INDEX を張っても使用できんと。へぇ。
上記を参考にした。
デフォルトで作成したnameのインデックスを一度削除し、「text_pattern_ops」をnameカラムのインデックスに設定し実行。
設定後は部分一致でもindex Scanされるようになりました。
めでたしめでたし。
以上。