嵌套查询在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缓慢。
如何在不改变数据库模式的情况下更快地更改查询?
答
一般情况下连接被认为比嵌套查询更好的索引。但有些情况下,嵌套查询可能比连接性能更好。
尝试此查询并比较结果。
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
你可以添加解释的输出。 – Zimbabao 2011-03-03 11:33:58
这是您实际使用的查询吗?这对我来说似乎是一个奇怪的查询..嵌套查询中的双'from'和'*'看起来好像不能很好地工作...... – gnur 2011-03-03 11:35:26
查询将不会运行。在使用'>'操作符时,不允许在子选择中返回多个列(实际上,我认为MySQL中不可能返回MySQL中的多个列中的多个列) – 2011-03-03 11:40:00