相关SQL语句说明

本案例中,使用如下的查询语句,在优化前,涉及到多表关联和子查询以及分页,使用了select * ,性能差,不可控:

SELECT *
FROM (
    SELECT *
    FROM order_main om
    LEFT JOIN order_detail od ON om.order_id = od.order_id
    WHERE om.order_status IN (1, 2, 3)
      AND om.create_time >= '2025-01-01 00:00:00'
      AND om.user_id IN (
          SELECT user_id
          FROM user_info
          WHERE user_level >= 2
            AND is_active = 1
      )
) AS order_full
LEFT JOIN product_info pi ON order_full.product_id = pi.product_id
WHERE pi.is_on_sale = 1
ORDER BY order_full.create_time DESC, order_full.order_id DESC
LIMIT 0, 20;

代码优化说明

对整段代码执行注释,生成的样例代码如下,会对关键过滤条件和子查询以及整段SQL进行注释说明:

-- 获取2025年及之后创建、状态为1/2/3、且用户等级>=2的活跃用户的完整订单及明细信息
SELECT *
FROM (
    -- 关联订单主表与明细表,并筛选符合条件的订单
    SELECT *
    FROM order_main om
    LEFT JOIN order_detail od ON om.order_id = od.order_id  -- 左连接订单明细表
    WHERE om.order_status IN (1, 2, 3)  -- 订单状态为1,2,3
      AND om.create_time >= '2025-01-01 00:00:00'  -- 创建时间在2025年及以后
      AND om.user_id IN (
          -- 子查询:筛选用户等级>=2且为活跃状态的用户ID
          SELECT user_id
          FROM user_info
          WHERE user_level >= 2  -- 用户等级大于等于2
            AND is_active = 1  -- 用户状态为活跃
      )
) AS order_full
LEFT JOIN product_info pi ON order_full.product_id = pi.product_id
WHERE pi.is_on_sale = 1  -- 只取在售商品
ORDER BY order_full.create_time DESC, order_full.order_id DESC
LIMIT 0, 20;

代码注释效果截图

案例说明 - 图1