Нет простого способа сделать это.
1. Как вы узнали, обычно это сводится к выполнению 2 запросов:
Выполнение SELECT
с ограничением и смещением для извлечения данных, которые выneed.
Выполнение COUNT(*)
для подсчета общего количества страниц.
Этот подход может работать для таблиц, в которых не много строк, или при фильтрацииданные (для запросов COUNT
и SELECT
) по индексируемому столбцу.
2. Если ваша таблица большая, но данные, которые вам нужно отобразить, представляют меньшиепроцент данных из таблиц и , данные разделяют общую черту (например, данные на всех ваших страницах создаются за один день), которые вы можете использовать разбиение .Выполнение COUNT
и SELECT
на одном разделе будет намного быстрее, чем выполнение их на всей таблице.
3. Вы можете создать другую таблицу, в которой будет храниться значениезапрос COUNT
.Например, предположим, что ваша таблица big_table выглядит следующим образом:
id | user_id | timestamp_column | text_column | another_text_column
Теперь ваш запрос SELECT
выглядит следующим образом:
SELECT * FROM big_table WHERE user_id = 4 ORDER BY timestamp_column LIMIT 20 OFFSET 20;
И вашзапрос на подсчет:
SELECT COUNT(*) FROM table WHERE user_id = 4;
Вы можете создать count_table , который будет иметь следующий формат:
user_id | count
Как только вы заполните эту таблицу текущими данными вСистема, вы создадите триггер, который будет обновлять эту таблицу при каждой вставке или обновлении big_table .
Таким образом, запрос подсчета будет очень быстрым, потому что он будет выполняться на count_table , например:
SELECT count FROM count_table WHERE user_id = 4
Недостаток этого подхода заключается в том, что вставка в big_table будет медленнее, поскольку триггер будет срабатывать и обновляться count_table для каждой вставки.
Это подходы, которые вы можете попробовать, но в конечном итоге все зависит от размера и типа ваших данных.