SQL Optimize Best EXPLAIN?

时间:2017-07-21 04:14:24

标签: mysql sql optimization

SELECT op.order_id
FROM order o
JOIN order_product op
USING(order_id)
WHERE o.quantity_complete = 0
GROUP BY op.order_id 
HAVING SUM(op.presale) = 0

如果op.presale仅包含0和1,则在op.presale上设置索引是个好主意。

1 个答案:

答案 0 :(得分:0)

我不认为HAVING子句中列的索引会产生任何影响。但是,您可以重写查询以将HAVING子句中的逻辑移动到WHERE子句:

SELECT
    op.order_id
FROM order o
INNER JOIN order_product op
    ON o.order_id = op.order_id
LEFT JOIN
(
    SELECT DISTINCT order_id
    FROM order_product
    WHERE presale <> 0
) t
    ON op.order_id = t.order_id
WHERE
    o.quantity_complete = 0 AND
    t.order_id IS NULL          -- replaces the HAVING clause
GROUP BY op.order_id

这里的基本思想是加入一个新的子查询,该子查询找到所有order_id至少有一个预先设定值为零。因此,这种匹配order_id将具有不等于零的预售总和。我对此子查询使用LEFT JOIN,然后仅保留与此子查询匹配的订单记录。