Если клиентская часть - это вывод на экран для человека, то ему, человеку, одномоментно не требуется весь млн. Может пагинация по какому-то условию поможет?
Кстати, если хотите сделать пагинацию, то попробуйте CTE. Минус - не используются индексы, но если у вас на странице пара десятков записей из миллиона, то будет существенно быстрее всё равно.
В вашем случае:
with t as (select id from blog order by date_added desc, blog_id desc limit 5, 5 ) select i.* from blog i, t left join blog_description... where i.id=t.id
Тем самым вы существенно сократите первую таблицу, к которой джойнятся остальные.
И второе - НИКОГДА не используйте SELECT *, только перечисление полей, т.к. текстовые столбцы выбираются через временную таблицу и в будущем если вы добавить ещё столбец, селект может заглючить, например, появится 2 одинаковых имени.
Резюме: в таблицу t вы предварительно выбираете только айдишники с ограничением по кол-ву, по ним прикрепляете остальные поля с той же таблице, а потом join других.
Вопрос не понял, но по вашему первому селекту поправил бы немного.
У вас: "WHERE id.language_id =..."
Лучше бы: "blog_description id ON (i.blog_id = id.blog_id AND id.language_id=...)"
и остальные аналогично. Суть в том, чтобы уменьшить таблицу которая участвует в join, тем самым ускорив процесс. Если делать как у вас, то сначала проходит объединение таблиц (очень накладная операция), а потом отсечение лишнего по where - это намного накладнее.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.