gzhegow
@gzhegow
aka "ОбнимиБизнесмена"

Как вывести списки с постраничной навигацией для базы в 2 млн записей?

Сложный запрос переполняет /tmp в linux
Работает на первых страницах без проблем, на страницах от 200 и выше вешает.

Запрос тупой, какие предложения по оптимизации?
Индексы есть, составные тоже есть (уже) :)
Там сортировка сложная оч:
SELECT (запчасти) FROM (таблица) WHERE category_id IN (%d....%d) OR category_id IS NULL ORDER BY category_id = main_category_id DESC, ISNULL(category_id), ISNULL(name), partnumber, name;


Из-за двух миллионов записей (некоторые говорят что для СУБД два миллиона это должно быть что-то незаметное и мгновенное) - на 200 странице, когда OFFSET становится близким к 400 тысяч - вешается /tmp

Предложения?
  • Вопрос задан
  • 304 просмотра
Пригласить эксперта
Ответы на вопрос 3
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Это каноническая задача на самом деле.
Дело в том, что для обработки offset 400 000 - sql сервер должен фактически найти 400 000 записей удовлетворяющих условию, отбросить их и дальше уже вывести результат.

/tmp при этом переполняться по идее не должен, могу предположить что серверу тупо не хватает памяти.
Покрутите mysqltuner какой-нибудь.

Нормальных решений проблемы нет, есть обходные пути:
1) Вводите какой-то неразрывный индекс удовлетворяющий выборке, вместо limit делаете where tmp_id between 400000 and 400100 - в вашем случае вероятно не подойдет.
2) Придумываете какой-то альтернативный способ пагинации опять же без offset - например перебор дат записей или еще что-то.
3) Задаетесь глобальным вопросом нафига вообще пагинация на 400 000 записей и отказываетесь от неё :-D
Очевидно что пользователь такое количество записей не воспримет никогда, так что пусть уточняет запрос.
Ответ написан
@davidnum95
Если id - это автоинкремент, то можно по нему ориентироваться, откинув offset.
Ответ написан
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Попробуйте подойти иным путем к задаче: зачем нужны страницы у такой выборки?
Сделайте интерфейс, выведите в него хотя бы 200 записей и попробуйте поработать. Вы быстро поймете что листать страницы неудобно и не нужно.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы