加速OpenCart中的MySQL查询

时间:2015-09-02 21:26:08

标签: php mysql

我不知道这是一个好问题,但我在我的一个模块中有这个查询:

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' );

产品表上的当前索引:

enter image description here

在ixml_prd_map上:

enter image description here

1 个答案:

答案 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_prdid_xml列ON ixml_prd_map表上有索引。