Хочу сделать поиск песни по названию с пагинацией. Есть две таблицы: одна таблица с названием песни, вторая - с именем исполнителя. В первой таблице 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]
Наверное так быстрее будет? Самое главное - как реализуются такие вещи по-человечески? Спасибо