Как увеличить скорость запроса без использования полнотекстового поиска? - PullRequest
3 голосов
/ 06 января 2011

Это мой простой запрос; При поиске selectnothing я уверен, что у меня не будет показов.

SELECT nome_t FROM myTable WHERE nome_t ILIKE '%selectnothing%';

Это EXPLAIN ANALYZE VERBOSE

Seq Scan on myTable  (cost=0.00..15259.04 rows=37 width=29) (actual time=2153.061..2153.061 rows=0 loops=1)
  Output: nome_t
  Filter: (nome_t ~~* '%selectnothing%'::text)
Total runtime: 2153.116 ms

myTable имеет около 350 тыс. Строк, а определение таблицы выглядит примерно так:

CREATE TABLE myTable (
    nome_t text NOT NULL,
)

У меня есть индекс для nome_t, как указано ниже:

CREATE INDEX idx_m_nome_t ON myTable
USING btree (nome_t);

Хотя это явно хороший кандидат для полнотекстового поиска, я бы хотел пока исключить этот вариант.
Этот запрос предназначен для запуска из веб-приложения, и в настоящее время он занимает около 2 секунд, что явно слишком много;
Могу ли я что-нибудь сделать, например, использовать другие методы индексации, чтобы повысить скорость этого запроса?

Ответы [ 2 ]

4 голосов
/ 06 января 2011

Нет, ILIKE '% selectnothing%' всегда требует полного сканирования таблицы, каждый индекс бесполезен.Вам нужен полнотекстовый поиск, это не так сложно реализовать.


Редактировать: Вы можете использовать Wildspeed, я забыл об этой опции.Индексы будут огромными, но ваша производительность также будет намного лучше.

Расширение Wildspeed обеспечивает поддержку индекса GIN для подстановочного поиска для оператора LIKE.

http://www.sai.msu.su/~megera/wiki/wildspeed

1 голос
/ 16 января 2011

еще одна вещь, которую вы можете сделать - разбить этот столбец nome_t в таблице myTable на собственную таблицу. Поиск в одном столбце из таблицы выполняется медленно (если имеется пятьдесят других широких столбцов), поскольку другие данные эффективно замедляют сканирование по этому столбцу (поскольку на страницу / экстент приходится меньше записей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...