如何改进这个SQL? (MySQL数据库)

时间:2011-09-26 07:46:42

标签: mysql sql database

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条记录,搜索的字段已编入索引。 我得到结果需要很长时间,有时我会收到内部服务器错误。

如何改进查询?

1 个答案:

答案 0 :(得分: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

这应该为您提供执行计划。有了它,您可以看到它是否正确使用索引,或者您的某个条件是否激发了全表扫描。如果是,则需要另一个索引,或者您可能需要修改查询本身。