【问题标题】:SQL Optimize Best EXPLAIN?SQL 优化最佳解释?
【发布时间】:2017-07-21 12:29:40
【问题描述】:
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 上建立索引是否是个好主意。

【问题讨论】:

  • 我认为在这种情况下不会有任何改善。不过你可以自己查!在创建索引之前和之后使用 EXPLAIN ,看看是否有任何区别。我认为不会有任何区别。

标签: mysql sql optimization


【解决方案1】:

我认为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,然后只保留与该子查询匹配的订单记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2021-09-27
    • 2014-07-19
    • 2011-03-14
    • 2021-11-21
    相关资源
    最近更新 更多