Reducing latency in read operations
I would compute the buckets by FLOOR(price/10).  Should 510 be in the 50 bucket?  Or the 51 bucket?  Or both?

"put each item into an appropriate bucket" sounds like an INSERT statement.  But 
"will be summed" sounds like a SELECT statement.  Which do you mean?

Assuming you are selecting all 45M rows, here is the optimal query:

SELECT  10 * FLOOR(price/10) AS 'price bucket',
        category,
        subcategory,
        SUM(order_quantity) AS 'quantity'
    FROM tbl
    GROUP BY 1,2,3


(Or do you need item in the GROUP BY?)

The real performance problem is that you need to read all 45M rows.

There might be a way to speed it up.  What is the data flow?  Do you insert rows and then never change or delete them?  If so a Summary Table that you build and maintain (daily?) would be much smaller and faster.