В Postgresql, как ускорить запросы подстроки - PullRequest
1 голос
/ 01 сентября 2010

У меня есть простая таблица журналов с около 500 000 строк, структура таблицы -

 TABLE logs
(
  id serial NOT NULL,
  username character varying(32),
  user_id integer,
  description text NOT NULL,
  "time" timestamp with time zone DEFAULT now(),
  referrer character varying(128),
  "type" character varying(25)
)

Наиболее распространенная операция с точки зрения запроса этой таблицы к содержимому столбца description .Типичный запрос ...

SELECT username , time , description FROM logs WHERE description ~* 'some text'  ORDER by time DESC

Для получения результатов требуется от 8 до 20 секунд.Есть ли другой способ оптимизации таблицы или запроса, который бы давал более быстрые результаты.Я нахожусь на 8.2 Portgresql.

Ответы [ 2 ]

3 голосов
/ 01 сентября 2010

Прежде всего, вам нужно перейти на 8.4, чтобы получить все новые преимущества в производительности. 8.4 имеет встроенный tsearch для полнотекстового поиска . Если вы не можете выполнить обновление, установите Tsearch2 из contrib.

Для дальнейшей оптимизации я бы создал индекс для time и использовал его для ограничения результатов. Э.Г.

SELECT username , time , description FROM logs WHERE 
    to_tsvector('english', description) @@ to_tsquery('english', 'some text')
    AND time > current_timestamp - INTERVAL '1 day'
    ORDER by time DESC

См. Связанную документацию для получения дополнительной информации. Вам нужно создать индекс для to_tsvector, иначе полнотекстовый поиск совершенно бесполезен.

Редактировать : Если ваша таблица содержит миллионы кортежей данных, рассмотрите возможность воссоздания всей таблицы, используя разбиение , доступное в 8.2. Для повышения скорости работы перейдите на SSD-диски. См. эту статью для демонстрации увеличения скорости.

1 голос
/ 01 сентября 2010

Вы можете создать столбец (логическое значение), который устанавливается при вставке и обновлении через.триггер, тогда будет доступен поиск, но условия поиска всегда будут одинаковыми.

Рассматривали ли вы использование Полнотекстовый поиск? Вам придется установить модуль FTS вручнуюв вашей версии postgres.

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