如何减少此 MySQL 查询中使用的 AND 数量?
How to reduce numbers of AND used in this MySQL query?
这是我正在处理的查询,它以某种方式花费了很多时间并最终超时,这让我考虑是否可以减少 WHERE 子句中的 AND 的数量。我是这个巨大查询的新手。
SELECT sfog.entity_id,
(
CASE
WHEN sfog.status = 'delivered' THEN 'Order'
WHEN sfog.status IN ('return','rtndelivered','closed') THEN 'Return Order'
WHEN sfog.status = 'CanceledBS' THEN 'CanceledBS Order'
END) AS Type,
CONCAT(cev1.value,' ', cev2.value) AS 'Vendor Name',
sfog.status AS Status,
sfog.increment_id AS OrderNo ,
sfosh.created_at AS 'Invoice Date',
mo.tracking_number AS 'Tracking Number',
CONCAT(sfoa.firstname,' ', sfoa.lastname) AS 'Customer Name',
CONCAT(sfoa.street,' ',sfoa.city,' ',sfoa.region,' ',sfoa.postcode) AS 'Address',
sfoa.email AS 'Email',
group_concat( DISTINCT sfoi.sku SEPARATOR ', ') AS `Product Name`,
sfo.total_qty_ordered AS 'Qty',
SUM(ms.totalamountut) AS 'Order Value'
FROM sales_flat_order_grid sfog,
sales_flat_order_status_history sfosh,
customer_entity_varchar cev1,
customer_entity_varchar cev2,
marketplace_orders mo,
sales_flat_order_address sfoa,
sales_flat_order_item sfoi,
sales_flat_order sfo,
marketplace_saleslist ms
WHERE sfog.status IN ('delivered','return','rtndelivered','closed','CanceledBS')
and sfosh.parent_id = sfog.entity_id
and cev1.attribute_id = '5'
and cev2.attribute_id = '7'
and mo.seller_id = cev1.entity_id
and mo.seller_id = cev2.entity_id
and mo.order_id = sfog.entity_id
and sfoa.parent_id = sfog.entity_id
and sfoi.order_id = sfog.entity_id
and sfo.entity_id = sfog.entity_id
and ms.mageorderid = sfog.entity_id
GROUP BY sfog.entity_id;
这样加入:
FROM sales_flat_order_grid sfog
JOIN sales_flat_order_status_history sfosh
ON sfosh.parent_id = sfog.entity_id
JOIN marketplace_orders mo
ON mo.order_id = sfog.entity_id
JOIN customer_entity_varchar cev1
ON mo.seller_id = cev1.entity_id
JOIN customer_entity_varchar cev2
ON mo.seller_id = cev2.entity_id
JOIN sales_flat_order_address sfoa
ON sfoa.parent_id = sfog.entity_id
JOIN sales_flat_order_item sfoi
ON sfoi.order_id = sfog.entity_id
JOIN sales_flat_order sfo
ON sfo.entity_id = sfog.entity_id
JOIN marketplace_saleslist ms
ON ms.mageorderid = sfog.entity_id
WHERE sfog.status IN ('delivered','return','rtndelivered','closed','CanceledBS')
AND cev1.attribute_id = '5'
AND cev2.attribute_id = '7'
GROUP BY sfog.entity_id;
它使您的代码更易于阅读
减少查询中 "and" 的数量与查询性能关系不大。如果您查看了此处 post 提出的一些 许多 关于提高查询性能的问题,您会注意到那些被点赞和回答的问题包括您的 post,喜欢模式和解释计划。
这将是对 运行 的一个非常繁重的查询 - 我们可以看到的 唯一 问题是表的数量。对于 9 个表,您至少需要 8 个连接谓词。这就是我们在您的查询中看到的与使用文字的三个过滤谓词混合在一起的情况。很可能其中一些表在此查询中是多余的,但我们无法确定。
"Huge queries" 在组成和优化方面与简短的没有什么不同。
这是我正在处理的查询,它以某种方式花费了很多时间并最终超时,这让我考虑是否可以减少 WHERE 子句中的 AND 的数量。我是这个巨大查询的新手。
SELECT sfog.entity_id,
(
CASE
WHEN sfog.status = 'delivered' THEN 'Order'
WHEN sfog.status IN ('return','rtndelivered','closed') THEN 'Return Order'
WHEN sfog.status = 'CanceledBS' THEN 'CanceledBS Order'
END) AS Type,
CONCAT(cev1.value,' ', cev2.value) AS 'Vendor Name',
sfog.status AS Status,
sfog.increment_id AS OrderNo ,
sfosh.created_at AS 'Invoice Date',
mo.tracking_number AS 'Tracking Number',
CONCAT(sfoa.firstname,' ', sfoa.lastname) AS 'Customer Name',
CONCAT(sfoa.street,' ',sfoa.city,' ',sfoa.region,' ',sfoa.postcode) AS 'Address',
sfoa.email AS 'Email',
group_concat( DISTINCT sfoi.sku SEPARATOR ', ') AS `Product Name`,
sfo.total_qty_ordered AS 'Qty',
SUM(ms.totalamountut) AS 'Order Value'
FROM sales_flat_order_grid sfog,
sales_flat_order_status_history sfosh,
customer_entity_varchar cev1,
customer_entity_varchar cev2,
marketplace_orders mo,
sales_flat_order_address sfoa,
sales_flat_order_item sfoi,
sales_flat_order sfo,
marketplace_saleslist ms
WHERE sfog.status IN ('delivered','return','rtndelivered','closed','CanceledBS')
and sfosh.parent_id = sfog.entity_id
and cev1.attribute_id = '5'
and cev2.attribute_id = '7'
and mo.seller_id = cev1.entity_id
and mo.seller_id = cev2.entity_id
and mo.order_id = sfog.entity_id
and sfoa.parent_id = sfog.entity_id
and sfoi.order_id = sfog.entity_id
and sfo.entity_id = sfog.entity_id
and ms.mageorderid = sfog.entity_id
GROUP BY sfog.entity_id;
这样加入:
FROM sales_flat_order_grid sfog
JOIN sales_flat_order_status_history sfosh
ON sfosh.parent_id = sfog.entity_id
JOIN marketplace_orders mo
ON mo.order_id = sfog.entity_id
JOIN customer_entity_varchar cev1
ON mo.seller_id = cev1.entity_id
JOIN customer_entity_varchar cev2
ON mo.seller_id = cev2.entity_id
JOIN sales_flat_order_address sfoa
ON sfoa.parent_id = sfog.entity_id
JOIN sales_flat_order_item sfoi
ON sfoi.order_id = sfog.entity_id
JOIN sales_flat_order sfo
ON sfo.entity_id = sfog.entity_id
JOIN marketplace_saleslist ms
ON ms.mageorderid = sfog.entity_id
WHERE sfog.status IN ('delivered','return','rtndelivered','closed','CanceledBS')
AND cev1.attribute_id = '5'
AND cev2.attribute_id = '7'
GROUP BY sfog.entity_id;
它使您的代码更易于阅读
减少查询中 "and" 的数量与查询性能关系不大。如果您查看了此处 post 提出的一些 许多 关于提高查询性能的问题,您会注意到那些被点赞和回答的问题包括您的 post,喜欢模式和解释计划。
这将是对 运行 的一个非常繁重的查询 - 我们可以看到的 唯一 问题是表的数量。对于 9 个表,您至少需要 8 个连接谓词。这就是我们在您的查询中看到的与使用文字的三个过滤谓词混合在一起的情况。很可能其中一些表在此查询中是多余的,但我们无法确定。
"Huge queries" 在组成和优化方面与简短的没有什么不同。