Привет всем!
Хотелось бы порассуждать на тему альтернативы для Union All
- есть несколько таблиц в базе, которые заполняют пользователи
- есть лента, куда выводятся посты из таблиц выше, отсортированные по дате
количество типовых таблиц увеличивается, в ленту подключаю все больше информации
соответственно количество UNION ALL в запросе растет, сейчас их уже 6, весь запрос визуально занимает целый экран full-hd монитора, ибо куча дополнительных JOIN
пока было 3 UNION ALL, запрос выполнялся в районе 500 мс при первом обращении, при повторном в районе 170-200
сейчас при 6 UNION ALL первый запрос выполняется в районе 700-1000 мс, повторный 300-400
Причина использования union all - возможность сделать пагинацию, альтернативы не вижу, но хотелось бы как-то ускорить запрос
индексы в базе настроены
Игорь: union позволяет вытащить данные из нескольких таблиц, в которых абсолютно разное число данных, в 1 массив с определенным limit и offset. как это сделать кроме как через union - я не в курсе, собственно поэтому и создал этот топик, вдруг кто-то предложит какой-то альтернативный способ?
Игорь: Еще раз: представьте себе ленту пользователя, в которой сообщения из абсолютно разных-никак-не-связанных таблиц, все что их объединяет - это author записи. Лента складывается из журналов машин, журналов пользователей, новых товаров в магазинах, новых записях о поездках, репосты записей и прочее - все это выводится в 1 ленту. Выводится по 30 штук на страницу. Как вы предлагаете мне связывать не связанные таблицы через JOIN ? join участвуют внутри каждого SELECT, которые объеденены в UNION. Мне и нужен по сути "результат нескольких селектов".
Вячеслав: теперь представил.
Как часто обновляются данные?
Возможно Вам поможет сделать временные таблицы в памяти и загружать результаты запросов туда.
Возможно для целей ленты стоит завести отдельную таблицу и туда сливать данные в нормированном для ленты виде. (да будет дублирование данных что плохо, но имхо в вашем случае необходимо как можно меньше запросов)
Вячеслав: ну а что касается времени, то оно и будет увеличиваться, ведь по сути вы раньше выполняли 3 запроса, а сейчас 6, объедения в конце результаты.
Возможно гдето дублируются данные и этого можно избежать. А может где можно объединиться через join, или разбить запрос на несколько мелких и обработать их уже в коде.