嵌套查询在MySQL中非常慢。如何优化它?

问题描述:

我有一个表hall_products与产品。每个产品都有一个NAME,以指定的QUANTITY出售,并仅出售给CITY_CODE指定的一个城市。 现在下一张表是delivery_address。每个送货地址都是一个城市,它包含一个CITY_CODE和MAX_QUANTITY,这是可以发送到该城市的产品的最大数量(不管是什么产品)。嵌套查询在MySQL中非常慢。如何优化它?

因此,例如,我有一个产品牛奶的数量1升,并用代码14表示柏林市代码。 我可以送到柏林(城市代码14)的最大数量是0,7升。比我把牛奶运到柏林是因为数量高于最大量。

我想要得到的是所有可以运往世界任何地方的商品的名称。所以我需要获得所有符合目标城市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) 

但这种查询是SOOO缓慢。

如何在不改变数据库模式的情况下更快地更改查询?

+1

你可以添加解释的输出。 – Zimbabao 2011-03-03 11:33:58

+2

这是您实际使用的查询吗?这对我来说似乎是一个奇怪的查询..嵌套查询中的双'from'和'*'看起来好像不能很好地工作...... – gnur 2011-03-03 11:35:26

+2

查询将不会运行。在使用'>'操作符时,不允许在子选择中返回多个列(实际上,我认为MySQL中不可能返回MySQL中的多个列中的多个列) – 2011-03-03 11:40:00

一般情况下连接被认为比嵌套查询更好的索引。但有些情况下,嵌套查询可能比连接性能更好。

尝试此查询并比较结果。

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 

尝试

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 

这将正常工作再次,如果你有数量和CITY_CODE

,所以我需要得到适合进入目标城市的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