Is it more performant to use a JOIN or a when using LIMIT 1?
The ORs are deadly for performance.  For starters, decide on 0 or NULL so you won't have to test for both.  (That won't actually help any since there would still be other ORs.)

I'm dubious about the formulation of the LEFT JOIN.  (BTW, OUTER is optional.)  Normally when using LEFT, the ON only says how the tables are related (p.id=qd.product_id); the WHERE provides the filtering.

I don't know which is better, but since you seem to be limiting to one id (via WHERE p.id=?), then the second formulation will look into quantity_discounts only once, and (hopefully) won't have too many rows to check.  That is, the OR may not be as bad as I started out with.

A slight help on quantity_discounts will be

INDEX(product_id, price)  -- in this order


Now I am worried.  One formulation has AND qd.min_amount &lt;= ?, the other does not.