Ermak1
@Ermak1
Web-dev

Как сделать выборку с LIMIT и подсчет записей одним запросом?

Задача типичная, пагинация записей из базы.
Сделать выборку записей с лимитом и подсчитать сколько записей всего попадает под это условие.
Стандартное решение:
SELECT * FROM users WHERE status > 0 limit 10;
SELECT COUNT(*) FROM users WHERE status > 0;


Но 2 запроса к базе не есть хорошо, а если основной запрос тяжелый с Join'ами и вложенными запросами, то вдвойне не хорошо. Вроде есть решение с SQL_CALC_FOUND_ROWS, но почему-то на mariaDB 10.1.44 не работает, а в MySQL 8.0 вообще судя по официальному сайту объявлено устаревшим.

Кто как решает данную проблему? На данный момент я использую классический метод с 2-мя запросами и кэширую результаты подсчета средствами PHP + memcached для не часто обновляемых данных. Т.е второй запрос на подсчет количества записей делаю не всегда.
  • Вопрос задан
  • 498 просмотров
Решения вопроса 2
yellow79
@yellow79
Senior Software Engineer
SELECT count(*) over() as total, status FROM users WHERE status > 0 limit 10;
Ответ написан
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
1. SQL_CALC_FOUND_ROWS использовать нельзя вообще. В отличии от count это безумно медленно.
https://bugs.mysql.com/bug.php?id=19553

2. Два запроса это по дефолту правильное решение.
- количество запросов стоит оптимизировать когда их получаются сотни. Заменять 2 запроса на 1 - такая себе оптимизация.
- запрос count зачастую можно оптимизировать относительно запроса с данными убрав лишние таблицы.

3. Любые кеши стоит вводить в проект только когда у вас база реально перестает справляеться.

4. В реальной задаче с пагинацией основная боль это большие offset :)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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