@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]
Наверное так быстрее будет? Самое главное - как реализуются такие вещи по-человечески? Спасибо
  • Вопрос задан
  • 580 просмотров
Решения вопроса 1
@forspamonly2
так у вас не сортировка и не разбиение на страницы тормозят, а поиск по регэкспу. который не индексируется. замените его на full-text search (tsvector и так далее) или действительно на какой-нибудь внешний индексатор, типа солра или сфинкса, переводите.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы