Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中的嵌套查询非常慢。如何优化它?_Mysql_Sql_Performance - Fatal编程技术网

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

MySQL中的嵌套查询非常慢。如何优化它?,mysql,sql,performance,Mysql,Sql,Performance,我有一张桌子,上面有产品。每种产品都有一个名称,按规定数量出售,并且仅向城市代码所指的一个城市出售。 现在下一个表是交货地址。每个送货地址都是一个城市,它包含一个城市代码和最大数量,这是可以发送到此城市的产品的最大数量(无论是什么产品) 例如,我有一种产品牛奶,数量为1升,地址是城市,代码为14,意思是柏林。 我能送到柏林的货物的最大数量(城市代码14)是0.7升。然后我把牛奶运到柏林,因为数量比最大数量高 我想得到的是所有可以运往世界任何地方的货物的名称。所以我需要得到所有符合目标城市最大数量

我有一张桌子,上面有产品。每种产品都有一个名称,按规定数量出售,并且仅向城市代码所指的一个城市出售。 现在下一个表是交货地址。每个送货地址都是一个城市,它包含一个城市代码和最大数量,这是可以发送到此城市的产品的最大数量(无论是什么产品)

例如,我有一种产品牛奶,数量为1升,地址是城市,代码为14,意思是柏林。 我能送到柏林的货物的最大数量(城市代码14)是0.7升。然后我把牛奶运到柏林,因为数量比最大数量高

我想得到的是所有可以运往世界任何地方的货物的名称。所以我需要得到所有符合目标城市最大数量限制的商品

我写了这个查询:

SELECT p.NAME FROM hall_products as p where p.QUANTITY >
 (SELECT MAX_QUANTITY from delivery_address WHERE 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

如果您有数量和城市代码的索引,那么这将再次正常工作。在一般情况下,连接被认为比嵌套查询更好。但在某些情况下,嵌套查询的性能可能优于连接

尝试此查询并比较结果

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
选择p.NAME
从hall_products作为p,交货地址作为d
其中p.QUANTITY
所以我需要得到所有符合目标城市最大数量限制的商品


Fit-into-means
你能添加explain的输出吗?这就是你实际使用的查询吗?对我来说,这似乎是个奇怪的问题。。嵌套查询中的双
from
*
使它看起来工作不太好…查询根本不会运行。在使用
操作符时,不允许在子选择中返回多个列(实际上,我认为在MySQL中,在MySQL中,在子选择中返回多个列是不可能的)。不仅查询不会运行,示例也是错误的:数量为1升的产品牛奶。。。我能送到柏林的货物的最大数量(城市代码14)是0.7升。然后我把牛奶运到柏林,因为数量低于我投票反对的最大数量。@gnur,@a_horse_,没有名字-查询时出错,现在没事了。
SELECT p.NAME
FROM hall_products p
JOIN delivery_address a on a.CITY_CODE = p.CITY_CODE
where p.QUANTITY <= a.MAX_QUANTITY