Mysql 在此查询上可以执行何种查询优化?

Mysql 在此查询上可以执行何种查询优化?,mysql,sql,Mysql,Sql,我根据这个查询列出了订单数据。此查询基本上从表中提取定期订单数据。我还使用一些下拉列表和输入字段来搜索/过滤查询结果 SELECT orders.id, parent_id, ( SELECT COUNT(*) FROM orders o WHERE o.parent_id = orders.id ) AS recurring_order_count, shopify_order_type, shop

我根据这个查询列出了订单数据。此查询基本上从表中提取定期订单数据。我还使用一些下拉列表和输入字段来搜索/过滤查询结果

SELECT
    orders.id,
    parent_id,
    (
    SELECT
        COUNT(*)
    FROM
        orders o
    WHERE
        o.parent_id = orders.id
) AS recurring_order_count,
shopify_order_type,
shopify_order_id,
shopify_order_customer_ID,
coupon_code AS coupon,
FORMAT(shopify_order_total_price, 2) AS shopify_order_total_price,
FORMAT(
    shopify_order_subtotal_price,
    2
) AS shopify_order_subtotal_price,
FORMAT(
    shopify_order_total_line_items_price,
    2
) AS shopify_order_total_line_items_price,
FORMAT(commission_amount, 2) AS commission_amount,
(
    CASE WHEN is_paid = 0 THEN 'No' WHEN is_paid = 1 THEN 'Yes' ELSE 'Rejected'
END
) AS is_paid,
(
    CASE WHEN is_invoice_generated = 1 THEN 'Pending' ELSE 'Invoice Generated'
END
) AS is_invoice_generated,
DATE_FORMAT(
    shopify_order_created_at,
    '%m-%d-%Y'
) AS shopify_order_created_at,
(
    CASE WHEN is_paused = 0 THEN 'Running' ELSE 'Paused'
END
) AS is_paused,
DATE_FORMAT(
    shopify_recurring_date,
    '%m-%d-%Y'
) AS shopify_recurring_date
FROM
    `orders`
WHERE
    coupon_code LIKE '%GERALD8314%' OR shopify_order_id LIKE '%GERALD8314%' OR(
        CASE WHEN is_paid = 0 THEN 'No' WHEN is_paid = 1 THEN 'Yes' ELSE 'Rejected'
    END
) LIKE '%GERALD8314%' OR(
    CASE WHEN is_invoice_generated = 1 THEN 'Pending' ELSE 'Invoice Generated'
END
) LIKE '%GERALD8314%' OR DATE_FORMAT(
    shopify_order_created_at,
    '%m-%d-%Y'
) LIKE '%GERALD8314%' OR(
    CASE WHEN is_paused = 0 THEN 'Running' ELSE 'Paused'
END
) LIKE '%GERALD8314%' OR DATE_FORMAT(
    shopify_recurring_date,
    '%m-%d-%Y'
) LIKE '%GERALD8314%' AND DATE_FORMAT(
    shopify_order_created_at,
    '%Y-%m-%d'
) BETWEEN ? AND ?
GROUP BY
    `id`
HAVING
    parent_id = 0 AND shopify_order_type = 1
ORDER BY
    `id`
DESC
LIMIT 10 OFFSET 0

这个查询优化了吗?这是从订单中选择计数(*)的
o.parent\u id=orders.id作为循环的\u order\u COUNT
行在查询执行速度方面最昂贵吗?这里有什么需要注意的地方来提高查询速度吗?请告知。

等带有前导通配符的
对性能很糟糕。考虑在相关栏目中有一个<代码>全文> <代码>索引。如果这是可行的,它将大大加快

    WHERE  coupon_code LIKE '%GERALD8314%'
      OR  shopify_order_id LIKE '%GERALD8314%' OR( CASE WHEN is_paid = 0 THEN 'No' WHEN is_paid = 1 THEN 'Yes' ELSE 'Rejected' END ) LIKE '%GERALD8314%' OR( CASE WHEN is_invoice_generated = 1 THEN 'Pending' ELSE 'Invoice Generated' END ) LIKE '%GERALD8314%'
      OR  DATE_FORMAT( shopify_order_created_at, '%m-%d-%Y' ) LIKE '%GERALD8314%' OR( CASE WHEN is_paused = 0 THEN 'Running' ELSE 'Paused' END ) LIKE '%GERALD8314%'
      OR  DATE_FORMAT( shopify_recurring_date, '%m-%d-%Y' ) LIKE '%GERALD8314%'
      AND  DATE_FORMAT( shopify_order_created_at, '%Y-%m-%d' ) BETWEEN ? AND ?
此外,结果可能会令人惊讶。请注意,您已经

a OR b OR c AND d
这和

a OR b OR (c AND d)
我猜你想

(a OR b OR c) AND d
我认为没有必要按分组。并且具有子句的
可以合并到
WHERE

    GROUP BY  `id`
    HAVING  parent_id = 0
      AND  shopify_order_type = 1
    ORDER BY  `id` DESC
这有多个问题:

DATE_FORMAT( shopify_order_created_at, '%Y-%m-%d' ) BETWEEN ? AND ?
之间的
为“包含”。按照您编写查询的方式,它将包括整个结束日。这可能不是你想要的

假设变量是日期或日期时间,可以简化为

shopify_order_created_at BETWEEN ? AND ?

可能会有更多的提示;修复这些问题,然后返回以获取更多信息。

您是否面临任何特定问题?尽管这看起来像是一个简单的查询(除了子查询之外)。大多数优化都与选择正确的索引有关。您的索引是什么?
像“%GERALD8314%”
不是可搜索的,从性能方面来说,没有什么可以改进的。
中的所有
,其中
通常也是性能杀手,如果使用
联合
s@KIKOSoftware索引为-父项id、已暂停、已暂停、优惠券id、已支付、已生成发票、已订购_type@HoneyBadger我将按照你的建议尝试联合。