2017-11-28 20 views
2

나는 postgres 9.6을 사용 중이다. JSONB 데이터를 한 열에 저장하면 하나의 쿼리 성능이 향상됩니다. 내 json 데이터에서 나는 텍스트가 name 열 있습니다. 다음 쿼리를 사용하여이 데이터를 쿼리하고 있습니다.ILIKE 포스트그레스 쿼리에서 GIN 인덱스 생성

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 

나는이 부동산에 대한 인덱스를 다음 생성 : 여기

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); 

하지만 항상 같은 결과입니다 . 쿼리 시간은 인덱스없이처럼 동일합니다. 그 데이터를 쿼리 할 때 PG가이 인덱스를 사용하지 않는 것을 볼 수 있습니다. 포스트그레스에서 텍스트 데이터의 색인을 생성하는 방법에 대한 많은 정보를 보았고, 필자의 경우에는 왜 작동하지 않는지 이해할 수 없습니다. 어떤 도움을 주셔서 감사합니다.

답변

2

문제는 SARGABLE

What makes a SQL statement sargable?

당신은 LIKE 'ABC%'에 대한 인덱스를 사용할 수 있지만, 심지어 MySQL 용 LIKE '%ABC%'

확인하는 팁의 대부분은 또한 포스트 그레스 MySQL은 적용되지 귀하의 경우 조건의 밤은있다 색인 TIPS

+0

'ILIKE % asd %'를 (를) 대체하는 요령이 있습니까? 해결 방안은 무엇인가? – dewastator

+0

[** 텍스트 검색 **] (https://www.postgresql.org/docs/current/static/textsearch.html)를 사용할 수 있습니다. 그러나 아직 JSON 필드와 함께 사용하지 않았습니다. –

+0

알겠습니다. 이제 'LIKE' 쿼리를 텍스트 검색 연산자로 대체하는 방법을 알아야합니다. 만약 당신이 튜토리얼을 가지고 있다면 (오히려 오히려 오히려 오피스가되기 쉽습니다) 여기에 게시하십시오. 고마워 – dewastator