PostgreSQLのLIKE部分一致でINDEXが効かない対応

PostgreSQLでインデックスを設定したカラムに対し、LIKE演算子を使って「部分一致('〇〇%')」で取得しようとしたが、INDEXが機能しない。

 

create index on m_user (name)

Indexの対象はユーザーマスタテーブルの「name」カラム。

 

f:id:arowe:20210225152728p:plain

WHERE句でカラムに対し「=(イコール)」条件による実行だと、Index Scan(索引兼検索)が行われている。が、


 

f:id:arowe:20210225151959p:plain
LIKE演算子の部分一致で実行すると、何故かSeq Scan(フルスキャン)で参照している。後方一致or部分一致ならわかるが、これがどうしたものか・・・。

 

 

lets.postgresql.jp

上記にテキスト検索によるインデックスの動きが紹介されていた。ふむふむ。



普通のインデックス (btree) を作成します。ただし、注意点が幾つかあります。

Cロケールを使う
インデックスを使えるのはロケールがCの場合に限られます。

 ・・・らしい。
日本語のロケールを使用した場合は、 INDEX を張っても使用できんと。へぇ。

 

qiita.com

上記を参考にした。

 

f:id:arowe:20210225153713p:plain

デフォルトで作成したnameのインデックスを一度削除し、「text_pattern_ops」をnameカラムのインデックスに設定し実行。

 

f:id:arowe:20210225154511p:plain

設定後は部分一致でもindex Scanされるようになりました。
めでたしめでたし。

 

以上。