我试图优化我的查询,因为它需要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(
使用的产品 .
量 ),0)
,每种产品的使用量-
IF((`products`.`productQuantity` - IFNULL(SUM(`products_uses`.`quantity`),0)) > 0, (`products`.`productQuantity` - IFNULL(SUM(`products_uses`.`quantity`),0)), 0)
我尝试将表的结构更改为myisam,而innodb没有任何更改。如何优化此查询?tnx公司
2条答案
按热度按时间vzgqcmou1#
提供
SHOW CREATE TABLE
会有帮助的。同时,我猜。这可能会(也可能不会)有帮助。它试图在不拖拽所有列的情况下求和
products
周围。它避免了GROUP BY
.这些索引应有助于:
如果
LEFT
如果没有必要,还会有其他优化。MySQL5.6将有助于子查询。
mysql 8.0可以帮助
ORDER BY
,同时,由于DESC
以及ASC
.rwqw0loc2#
我不确定引入用户变量会改变多少。但是在两个表上有条理地添加索引可能会有所帮助。试试这个:
第一个索引,在
products.nurseForm
列,可能有助于WHERE
条款。特别是,如果只有少数记录匹配,这个索引将是一个很大的帮助。第二个索引,在
products_uses.productId
,可能有助于更快地加入。同样,这取决于你的table有多大。你也可以跑步
EXPLAIN
看看是否还有其他瓶颈。