我不知道这是一个好问题,但我在我的一个模块中有这个查询:
SELECT * FROM `product` WHERE upc IN (
SELECT `upc` FROM `product` WHERE `upc` <> '' GROUP BY `upc` HAVING COUNT(*) > 1)
ORDER BY `upc`
产品表非常大,此查询大约需要20分钟才能执行。
我不是一个大的MySQL专家,但是可以加快这个查询的速度吗?
我的第二个重要查询是UPDATE查询:
UPDATE `product` SET `quantity` = '0' WHERE `sku` IN ( SELECT `id_xml_prd` FROM `ixml_prd_map` WHERE `id_xml` = '8' );
产品表上的当前索引:
在ixml_prd_map上:
答案 0 :(得分:3)
您可以使用下面的WHERE EXISTS
修改查询,而不是使用带有子查询的IN
子句。
SELECT * FROM `product` p
WHERE EXISTS (
SELECT 1 FROM
`product`
WHERE `upc` <> '' AND `upc` = p.`upc`
GROUP BY `upc`
HAVING COUNT(*) > 1)
ORDER BY `upc`;
此外,您还希望在upc
列上添加索引。
执行正常的update join
查询,而不是IN
子查询
UPDATE `product` p
JOIN `ixml_prd_map` i ON p.`sku` = i.`id_xml_prd`
AND i.`id_xml` = '8'
SET p.`quantity` = '0';
此UPDATE
查询更快,在id_xml_prd
和id_xml
列ON ixml_prd_map
表上有索引。