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我将按照你的建议尝试联合。