简体   繁体   中英

How to increase the speed of MySQL query with extra condition?

I'm trying to speed up the following query as it takes quite long to run: now it's 'only' about 1.5 seconds, but it will certainly get slower with more rows (which will 10x over the next period).

Basically, I want to show all the rows from the orders table for the user, and per row show the total order amount (which is the SUM of the orders_products table).

SELECT 
orders.order_number,
orders.order_date, 
companies.company_name,
COALESCE(SUM(orders_products.product_price * orders_products.product_quantity),0) AS order_value 
FROM orders 
LEFT JOIN companies ON companies.id = orders.company_id
LEFT JOIN orders_products ON orders_products.order_id = orders.id
LEFT JOIN users ON users.id = orders.user_id 
WHERE orders.user_id = '$user_id'
AND companies.user_id = '$user_id'
GROUP BY orders.id ORDER BY orders.order_date DESC, orders.order_number DESC

I've tried adding another condition AND orders_products.user_id = '$user_id' . Speed wise the query was about 12x faster (yeah.) but the problem is that not all orders have products in them, In this case. the orders without products in them are not returned.

How do I change my query so that despite of an order not having products in them, it still is returned (with total order value 0), whilst also speeding up the query?

Thank you in advance for your help!

You might find it faster to use a correlated subquery:

SELECT o.order_number, o.order_date,  c.company_name,
      (SELECT COALESCE(SUM(op.product_price * op.product_quantity), 0)
       FROM orders_products op
       WHERE op.order_id = o.id
      ) AS order_value 
FROM orders o LEFT JOIN
     companies c
     ON c.id = o.company_id AND c.user_id = o.user_id
WHERE o.user_id = '$user_id'
ORDER BY o.order_date DESC, o.order_number DESC

This gets rid of the outer aggregation which is often a performance win.

Then for performance you want the following indexes:

  • orders(user_id, order_date desc, order_number_desc, company_id)
  • companies(id, company_id, company_name)
  • orders_products(order_id, product_price, product_quantity)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM