Лично я для себя решил, что вместо сложных джоинов, лучше использовать несколько запросов.
Ну а так, в первую очередь, стоит проставить индексы к тому, по чему джоинишь. И, желательно, чтобы эти данные были в int и т.п. (числовые) и не имело значения NULL (именно поле в NOT NULL)
Ещё стоит прочитать об
EXPLAIN
и как
понимать его ответ.