2011-03-03 243 views
-1

我有一個表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

回答

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 
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 

這將正常工作再次,如果你有數量和CITY_CODE

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