Из личного опыта по оптимизации PostgreSQL базы данных.
Объем строк: >>> 800067 raws.
Строки типа: TEXT
Разбитие строк: ,TEXT1,TEXT2,TEXT3,~~~,
>>> 800067 raws.
ALTER TABLE table.list ADD COLUMN itemnameTSVector TSVECTOR;
UPDATE table.list SET itemnameTSVector = to_tsvector(itemname);
CREATE INDEX list_GINindex ON table.list
USING GIN(itemnameTSVector);
Поисковый запрос без использования индекса:
>>> 7.2 sec.
SELECT * FROM table.list
WHERE itemname LIKE '%TEXT1%'
and itemname LIKE '%TEXT3%';
Поисковый запрос с использованием индекса:
>>> 7.0 sec.
SELECT * FROM table.list
WHERE tsvector(itemnameTSVector)
@@ tsquery('TEXT1 & TEXT3');
Далее пробовал с поисковым запросом без индекса, но с запятыми, как с разделителями:
>>> 7.0 sec.
SELECT * FROM table.list
WHERE itemname LIKE '%,TEXT1,%'
and itemname LIKE '%,TEXT3,%';
Вот и вся оптимизация. Результат на лицо.