【发布时间】:2018-12-21 13:59:39
【问题描述】:
我尝试优化我的查询,因为它需要 3.5 秒而且太长了。 这是我的查询:
SELECT
`products`.*,
IFNULL(SUM(`products_uses`.`quantity`),0) as `usesQuantity`,
IF((`products`.`productQuantity` - IFNULL(SUM(`products_uses`.`quantity`),0)) > 0, (`products`.`productQuantity` - IFNULL(SUM(`products_uses`.`quantity`),0)), 0) AS `totalUses`
FROM `products`
LEFT JOIN `products_uses` ON `products`.`id` = `products_uses`.`productId`
WHERE `products`.`nurseForm` = 1
GROUP BY `products`.`id`
ORDER BY `products`.`fav` DESC, `products`.`productName` ASC
我尝试使用变量进行优化,但没有任何改变:
SELECT
`products`.*,
@usesQuantity := IFNULL(SUM(`products_uses`.`quantity`),0) as `usesQuantity`,
IF((`products`.`productQuantity` - @usesQuantity) > 0, (`products`.`productQuantity` - @usesQuantity), 0) AS `totalUses`
FROM `products`
LEFT JOIN `products_uses` ON `products`.`id` = `products_uses`.`productId`
WHERE `products`.`nurseForm` = 1
GROUP BY `products`.`id`
ORDER BY `products`.`fav` DESC, `products`.`productName` ASC
这个查询
总结每种产品的使用量 - IFNULL(SUM(products_uses.quantity),0)
,
每种产品的使用量 -
IF((`products`.`productQuantity` - IFNULL(SUM(`products_uses`.`quantity`),0)) > 0, (`products`.`productQuantity` - IFNULL(SUM(`products_uses`.`quantity`),0)), 0)
我尝试将表的结构更改为 myISAM 和 InnoDB,但没有任何改变。 我能做些什么来优化这个查询? tnx
【问题讨论】:
-
1.使用explain 检查查询计划 2. 确定运行时间较长的第 3 部分,尝试对其进行优化(如何取决于解释结果) 4. 如果优化后时间不合适,请返回 1 作为第一种方法,我会添加产品。 productQuantity IS NOT NULL on WHERE 子句,这样可以避免检索它们并执行 ifnull
-
什么版本的 MySQL?
标签: mysql optimization myisam