2011-09-26 61 views
0
SELECT * 
FROM inventory 
WHERE inventory.zip IN (93650,93750,93765,93729,93710,93740,93711,93720,93704,93741,93705,93755,93791,93790,93794,93793,93726,93792) AND 
     inventory.price >= 1000 AND 
     inventory.year BETWEEN 1977 AND 2011 
ORDER BY price ASC LIMIT 0, 25 

的數據庫爲MySQL的InnoDB表(切換到MyISAM數據,看看它是如何工作)。 該表有大約500,000條記錄,並且搜索的字段被編入索引。 需要很長時間才能得到結果,有時會出現內部服務器錯誤。SQL如何改進? (MySQL數據庫)

如何改進查詢?

+0

看起來不錯。你限制了結果並保持它非常具體。查看索引數據庫的關鍵區域。 – Lostsoul

+0

也許你可以通過改變'和'price' zip'提高它的WHERE子句和價格列(組合索引與其他兩列)添加索引 – rabudde

+0

非常感謝你。 – Mircea

回答

3

研究查詢的執行計劃。在MySQL這是使用explain命令

EXPLAIN SELECT * 
FROM inventory 
WHERE inventory.zip IN (93650,93750,93765,93729,93710,93740,93711,93720,93704,93741,93705,93755,93791,93790,93794,93793,93726,93792) AND 
     inventory.price >= 1000 AND 
     inventory.year BETWEEN 1977 AND 2011 
ORDER BY price ASC LIMIT 0, 25 

這應該給你的執行計劃進行。有了這一點,你可以,如果它的正確使用索引,或者如果你的條件之一是挑起了全表掃描見。如果是,則需要另一個索引,否則可能需要修改查詢本身。

+0

非常感謝您!因爲我沒有註冊,所以我不能投票。 – Mircea