MySQL - Log data with Inner Join 12 Tables or Create View?
Normalize, but don't over-normalize.  Do not normalize things where the id is not significantly smaller than the value.  Do not normalize 'continuous' datatypes (ints, floats, dates); it severely hampers use of 'range' filtering.

Why do you have LEFT?  (If you need it, use it; if you don't then remove it so the Optimizer has more options.)

Do have INDEX order_id and do not put that table after LEFT.  Then, the Index can be used to find the rows more quickly than via a table scan.

When you still have performance problems, start with a minimal SELECT that finds the 30 ids that you need. Then join to the rest of the tables.  (And possibly self-joins back to the table to get the other columns needed.)  Use this as a "derived table" (... FROM ( SELECT ... ) ...).

A VIEW is just syntactic sugar.  Use it if it simplifies your code, but don't expect any performance benefit.