mysql - 优化查询——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
解决方案
我不确定引入用户变量会发生很大变化。但是在你的两个表上添加索引可能会有所帮助。尝试这个:
ALTER TABLE products ADD INDEX nurse_index (nurseForm);
ALTER TABLE products_uses ADD INDEX product_index (productId);
列上的第一个索引products.nurseForm
可能有助于该WHERE
子句。特别是,如果只有少数记录匹配,此索引将有很大帮助。
第二个索引 onproducts_uses.productId
可能有助于连接更快。同样,这将取决于您的表有多大。
您也可以运行EXPLAIN
以查看是否有任何其他瓶颈突出。