2017-11-28 4 views
2

私はpostgres 9.6を使用しています。 JSONBデータを1つの列に格納しているため、1つのクエリのパフォーマンスが向上します。私のjsonデータには、テキストであるnameの列があります。次のクエリを使用してこのデータを照会しています。ここでILIKE postgresクエリでGINインデックスを作成する

SELECT "id", "body", "created_at", "updated_at" 
FROM "read_models" 
WHERE ((body ->> 'name') ILIKE '%asd%') 
LIMIT 40 OFFSET 0; 

このクエリの解析結果である:私は別のインデックス・タイプを作成したが、それは常に同じ結果である

CREATE EXTENSION pg_trgm; 
CREATE INDEX idx_name ON read_models USING gin ((body ->> 'name') gin_trgm_ops); 

:私は、このプロパティの次のインデックスを作成し

Limit (cost=0.00..33.58 rows=40 width=72) (actual 
time=112.428..4071.757 rows=11 loops=1)              
| 
| -> Seq Scan on read_models 
(cost=0.00..2636.90 rows=3141 width=72) (actual time=112.416..4071.646 
rows=11 loops=1) | 
|   Filter: ((body ->> 'name'::text) ~~* '%asd%'::text)                      
| 
|   Rows Removed by Filter: 78516                           
| 
| Planning time: 1.658 ms                               
| 
| Execution time: 4071.847 ms 

。クエリ時間は、インデックスなしの場合と同じです。私はそのデータを照会するときにこのインデックスを使用していないことがわかります。私はポストグルでテキストデータをどのように索引付けするかについて多くの情報を見ましたが、なぜ私の場合にはうまくいかないのか分かりません。助けてくれてありがとう。

答えて

2

問題は、あなたがLIKE 'ABC%'のインデックスを使用しますが、LIKE '%ABC%'

のために大多数もPostgresの MySQLのために適用してもMySQLのために、これらのヒントをチェックすることはできませんあなたのWHERE条件イマイチSARGABLE

What makes a SQL statement sargable?

ですindex TIPS

+0

「ILIKE%asd%」を置き換えるヒントはありますか?解決策は何ですか? – dewastator

+0

[**テキスト検索**](https://www.postgresql.org/docs/current/static/textsearch.html)を使用することはできますが、まだJSONフィールドでは使用していません。 –

+0

ありがとうございます。今私は、 'LIKE'クエリをテキスト検索演算子で置き換える方法を理解する必要があります。いくつかのチュートリアルがあれば(ここではdocsに入るのが簡単になります)、ここに投稿してください。どうも – dewastator

関連する問題