Всем привет. Имеется вот такая таблица:
CREATE TABLE public.core_entry (
id INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('core_entry_id_seq'::regclass),
keyword CHARACTER VARYING(100) NOT NULL,
created TIMESTAMP WITH TIME ZONE NOT NULL
);
CREATE INDEX core_entry_e2fa5388 ON core_entry USING BTREE (created);
CREATE INDEX keyword_gist_idx ON core_entry USING GIST (keyword);
GiST индекс работает очень хорошо, но проблема в том, что он не работает на EXACT, т.е. при запросе
SELECT keyword FROM core_entry WHERE keyword='something';
Происходит Seq Scan
Да, это можно подстроить, написав
SELECT keyword FROM core_entry WHERE keyword LIKE 'something';
И результат будет такой же, но с применением индекса.
Главный (самый частый) же запрос выглядит вот так:
SELECT keyword, count(keyword) as count FROM core_entry WHERE keyword LIKE '%something%' GROUP BY keyword;
В этом случае функция count() начинает Seq Scan (судя по всему, проверяя равенство).
Тут я попробовал добавить обычный индекс:
CREATE INDEX keyword_idx ON core_entry USING BTREE (keyword);
И... Всё стало ещё хуже. Теперь он спокойно справляется с запросом
SELECT keyword FROM core_entry WHERE keyword='something';
Но LIKE '%something%' он обрабатывает последовательным чтением.
Вопрос:
Как изменить запрос (желательно удалив BTREE индекс, ибо в базу попадает 10млн записей в неделю), чтобы count(keyword) считался через GiST индекс?