Как правильно сформировать SQL запрос?
записей в таблице products очень много ( около 1млн ) 
это не много, это нормальнои запросы типа JOIN не предлагать, так как оно существенно влияет на производительность
а этот бред вы как догадались сюда приплести? У вас наоборот с выходом из внутренних джоинов выборка по ид будет сокращаться, в итоге по таблице продуктс будет только джоин нужных ид(что аналогично выборке where in, только с меньшими ограничениями, например ордер и лимит). По этому сджойнте мелкие таблицы, получите с них модел_ид, и по нему уже джоин продкут. 
Я бы денормализовал продуктс, внес бы еще брэнд_ид в него, но это так, мелочи.
Как уже сказали, вы не там смотрите. 1 млн — это немного, и запрос, даже с JOIN — очень простой, любая СУБД должна проглатывать его не поперхнувшись.
Скорее всего, вам надо тюнить настройки своей БД, там явно что-то не в порядке. Вот, например, статья для PostgreSQL: https://ruhighload.com/%D0%A2%D1%8E%D0%BD%D0%B8%D0...
Еще подобные статьи не раз публиковались на Хабрахабре.
Для начала надо показать здесь вывод EXPLAIN ANALYZE запроса (или аналог для вашей СУБД).