Есть таблица с данными по нескольким сайтам. В нее ежедневно пишется информация о… пользователя(-ей) за сутки. Сейчас в таблице более 2млн. записей.
Периодически строю отчеты в одном из них участвует поле в которое пишется url страницы на котором произошло то или иное действие.
Структура таблицы А:
...<br/>
host_id smallint NOT NULL,<br/>
url character varying(4096) NOT NULL,<br/>
...<br/>
бла бла<br/>
...<br/>
date_index timestamp without time zone,<br/>
Пример строки в поле url таблицы А: "/docs/8.3/static/datatype.html"
Структура таблицы Б:
host_id smallint NOT NULL,<br/>
...<br/>
бла бла<br/>
...<br/>
path1 character varying(4096),<br/>
path2 character varying(4096),<br/>
path3 character varying(4096),<br/>
path4 character varying(4096),<br/>
...<br/>
бла бла<br/>
...<br/>
date_index timestamp without time zone,<br/>
Пример строки в полях path* таблицы Б:
path1 «docs»
path2 «8.3»
path3 «static»
path4 «datatype.html»
Задача:
среди всех урлов записанных в таблицах А и Б найти строки с вхождением фразы, допустим «static», сравниваем результат, оптимизируем хранение.
Делаем explain analyze:
1. простой LIKE по полю url, Таблица А
QUERY PLAN: Seq Scan on Таблица А (cost=0.00..85702.85 rows=88130 width=169) (actual time=0.023..1450.782 rows=199220 loops=1)
Время выполнения: 1,737.457 мсек :((
2. делаем поиск по таблице Б, используя fts @@ ::tsquery
Время выполнения: 53.406 мсек
3. Поиск с учетом FTS по таблице Б
QUERY PLAN: Limit (cost=5783.37..5783.43 rows=25 width=176) (actual time=13474.382..13474.487 rows=25 loops=1) бла бла Index Cond: (fts @@ '''static'''::tsquery)
Время выполнения: 13,477.734 мсек
4. поиск фразы «static» только по полю path3, таблица Б
QUERY PLAN: Seq Scan on таблица Б (cost=0.00..129273.90 rows=337 width=299) (actual time=0.043..1173.613 rows=95 loops=1)
Время выполнения: 1,176.572 мсек
Сравниваем 1-4 варианта поиска, открываем пиво…
Пишем в Q&A хабра
Каковы оптимальные варианты хранения URL в базе, учитывая то что необходимо достаточно быстро осуществлять поиск записей по части урла? Таблица будет около 15млн записей.
Heeeeeeeeelp!