2011-09-26 59 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