嵌套查询在MySQL中是如此之慢。如何优化呢?

时间:2011-03-03 11:32:26

标签: mysql sql performance

我有一个带有产品的table hall_products。每个产品都有一个NAME,以指定的QUANTITY出售,并且仅限于CITY_CODE指向的一个城市。 现在下一个表是delivery_address。每个送货地址都是一个城市,它包含一个CITY_CODE和MAX_QUANTITY,它是可以发送到这个城市的产品的最大数量(无论什么产品)。

因此,例如,我有一个产品牛奶,数量为1升,并向城市发出代码为14,意思是柏林。 我可以发送到柏林(城市代码14)的最大数量的商品是0.7升。因为数量高于max_quantity,所以我将Milk送到柏林。

我想得到的是可以运往世界各地的所有商品的名称。因此,我需要获得符合目标城市max_quantity限制的所有商品。

我为此写了这个查询:

SELECT p.NAME FROM hall_products as p where p.QUANTITY >
 (SELECT MAX_QUANTITY from delivery_address WHERE CITY_CODE = p.CITY_CODE )

但是这个查询太慢了。

如何在没有数据库架构更改的情况下加快速度,也就是更改查询?

3 个答案:

答案 0 :(得分:2)

在一般情况下,连接被认为比嵌套查询更好。但有些情况下,嵌套查询的执行效果可能比连接更好。

尝试此查询并比较结果。

SELECT p.NAME 
FROM hall_products as p, delivery_address as d 
where p.QUANTITY < d.MAX_QUANTITY and d.CITY_CODE = p.CITY_CODE

答案 1 :(得分:0)

尝试

SELECT p.NAME 
FROM hall_products as p, delivery_address as d 
where p.QUANTITY > d.MAX_QUANTITY and d.CITY_CODE = p.CITY_CODE

如果您在QUANTITY和CITY_CODE

上有索引,这将再次正常工作

答案 2 :(得分:0)

  

所以我需要获得符合目标城市max_quantity限制的所有商品。

在我的书中适应<=,但我不是在maths.se,所以也许你知道我不知道的事情。

可以为结果的每一行运行子查询,它通常比创建JOIN慢。这是ANSI语法中的JOIN

SELECT p.NAME
FROM hall_products p
JOIN delivery_address a on a.CITY_CODE = p.CITY_CODE
where p.QUANTITY <= a.MAX_QUANTITY