首页 > 解决方案 > 优化查询——mysql

问题描述

我尝试优化我的查询,因为它需要 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.数量),0) ,每种产品的使用量 -

IF((`products`.`productQuantity` - IFNULL(SUM(`products_uses`.`quantity`),0)) > 0, (`products`.`productQuantity` - IFNULL(SUM(`products_uses`.`quantity`),0)), 0)

我试图将表的结构更改为 myISAM 和 InnoDB,但没有任何改变。我能做些什么来优化这个查询?tnx

标签: mysqloptimizationmyisam

解决方案


我不确定引入用户变量会发生很大变化。但是在你的两个表上添加索引可能会有所帮助。尝试这个:

ALTER TABLE products ADD INDEX nurse_index (nurseForm);
ALTER TABLE products_uses ADD INDEX product_index (productId);

列上的第一个索引products.nurseForm可能有助于该WHERE子句。特别是,如果只有少数记录匹配,此索引​​将有很大帮助。

第二个索引 onproducts_uses.productId可能有助于连接更快。同样,这将取决于您的表有多大。

您也可以运行EXPLAIN以查看是否有任何其他瓶颈突出。


推荐阅读