@givemoneybiatch
Немного веб, немного гейм

Как ускорить выборку с пагинацией в PostgreSQL?

Хочу сделать поиск песни по названию с пагинацией. Есть две таблицы: одна таблица с названием песни, вторая - с именем исполнителя. В первой таблице 20млн строк, во второй - 1,5млн.
Примерно выглядят так:
create table recording (
  "id" serial primary key,
  "name" varchar,
  "artist_credit" serial REFERENCES artist_credit (id),
);
create table artist_credit (
  "id" serial primary key,
  "name" varchar
);

В результате хочу получить список с названием песни + именем исполнителя. Пагинацию думал реализовать как динамическая подгрузка данных , которая будет срабатывать на скролл либо по клику на кнопку, хотя если будет быстрее работать постраничная пагинация - я не против. Итого самый сложный момент - быстрая выборка + пагинация. Сейчас запрос выглядит так:

self.searchGlobal = function (obj) {

return db.query(
"SELECT 
recording.id  AS \"recordingId\", artist_credit.name AS \"artistName\", recording.name AS \"trackName\",  
FROM recording 
INNER JOIN artist_credit ON recording.artist_credit = artist_credit.id 
WHERE recording.name ~ ${regex} AND recording.id > ${index} 
ORDER BY recording.id 
LIMIT ${limit};", obj);
  };

Была идея в том, чтобы получать айдишник последней выбранной песни и следующий запрос уже будет искать песни с айдишником больше, чтобы не было повторений и чтобы подгружались только те песни, которых еще нет. В результате запрос идет секунд 10. Если убрать ORDER BY примерно 300ms , но тогда непонятно как сделать пагинацию быстрее.

Пока писал, придумал другой способ: а что если отправлять с клиента список всех айди уже выбранных песен и в запросе к базе прописать что-то типа :
WHERE id NOT IN [array]
Наверное так быстрее будет? Самое главное - как реализуются такие вещи по-человечески? Спасибо
  • Вопрос задан
  • 322 просмотра
Решения вопроса 1
@forspamonly2
так у вас не сортировка и не разбиение на страницы тормозят, а поиск по регэкспу. который не индексируется. замените его на full-text search (tsvector и так далее) или действительно на какой-нибудь внешний индексатор, типа солра или сфинкса, переводите.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Acme Crypto Corp Нижний Новгород
от 180 000 до 250 000 руб.
RentaTeam Москва
от 120 000 до 160 000 руб.
12 нояб. 2019, в 12:35
1200 руб./в час
12 нояб. 2019, в 12:16
400 руб./за проект
12 нояб. 2019, в 11:14
300 руб./за проект