Разбиение на страницы MySQL: эффективное получение результатов и общего количества
При реализации разбиения на страницы в MySQL обычной практикой является выполнение двух отдельных запросов: один к получить общее количество результатов и еще один, чтобы ограничить количество выбранных записей. Этот подход, известный как двойной запрос, может быть неэффективным для больших наборов данных.
Однако возникает вопрос, можно ли получить как общее количество результатов, так и ограничить их в одном запросе. Хотя прямого способа добиться этого нет, доступны два альтернативных метода:
SQL_CALC_FOUND_ROWS и FOUND_ROWS()
Вместо двойного запроса вы можете использовать SQL_CALC_FOUND_ROWS и FOUND_ROWS() для достижения аналогичного результата. Запрос с SQL_CALC_FOUND_ROWS предшествует ограничивающему запросу, а вызов FOUND_ROWS() извлекает общее количество.
Пример:
SELECT SQL_CALC_FOUND_ROWS * FROM `table` WHERE `some_condition`; SELECT FOUND_ROWS();
Примечание: У этого метода есть потенциальный недостаток. В MySQL есть ошибка, которая влияет на запросы ORDER BY при использовании этого метода, замедляя работу с большими таблицами.
Кэширование счетчика
Альтернативное решение включает в себя кэширование общего количества на определенный срок. Этот подход устраняет необходимость в отдельном запросе для получения счетчика, сохраняя при этом эффективность.
Пример:
Получите счетчик и кешируйте его на 10 минут:
SET @count = (SELECT COUNT(*) FROM `table` WHERE `some_condition`);
In последующие запросы используют кэшированный счетчик:
SELECT * FROM `table` WHERE `some_condition` LIMIT 0, 10;
Кэширование счетчика значительно повышает производительность, особенно для часто посещаемых страниц. Хотя это не решение с одним запросом, оно дает тот же результат, но более эффективно, чем двойной запрос.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3