2011-07-14 107 views
0

我有〜100000个条目的数据库 - 现在我的查询看起来是这样的:慢MySQL查询/ IN子句

SELECT ID,邮编,价格从上市WHERE邮编IN(96815,96815, 96835 ,96828,96830,96826,96836,96844,96816,96847,96814,96822, 96823,96843,96805,96806,96810,96848,96808,96809,96842,96839, 96802,96812,96804,96803,96840,96840, ,96807,96813,96841,96801,96850, 96811,96898,96837,96827,96824,96846,96821,96817,96859,96838, 96819,96820,96858,96849,96825,96795,96863,96818,96853 ,96861, 96734,96744,9 6701,96860,96709,96782,96706,96797,96862,96789, 96707,96730,96854,96759,96786,96857,96717,96792,96762,96712, 96791,96731)和(价格在1000和1200之间的价格) ORDER BY ID

这个查询工作得很好,当我只有50 000个,但它变得非常缓慢,当我延长了邮政编码的半径(这将导致更多的邮政编码的条款)。

ID INT(8)AUTO_INCREMENT价格MEDIUMINT(7) 邮政编码MEDIUMINT(5)

所有三个字段索引。有没有人有一个想法,我可以优化它?谢谢你们

+0

我敢肯定,如果你有一个索引,很多邮政编码在IN子句中即使该字段被索引,它也会运行缓慢。我不知道如何解决这个问题,除了限制拉链的数量。 –

+0

我可以在邮政编码列表中看到重复的值。确保你只给出不同的值和增量。 – ysrb

回答

0

邮政编码一般地理上分布的 - 你也许能够通过简化邮政编码子句类似加快速度:

zipcode BETWEEN 96700 AND 96898 

这可能最终会在不经意间包括一些邮政编码,你不想要,但最终可能会更有效地过滤掉它们。

+0

听起来似乎合理 - 看起来有点帮助 – Manuel

0

被索引的每个字段和被正确索引的字段之间存在很大差异。 至于我能看到你只需要一个索引,使查询运行得更快

尝试创建一个具有以下列(邮编,价格)

+0

问题是我还有其他疑问(所以我需要其他两列的索引)。主要关心的是zip查询。 – Manuel

+0

这很好,如果其他查询使用索引,但我的意思是,仅仅因为您在列上有索引,并不意味着您的查询可以使用它。创建包含两列的索引,并让我知道它是否有帮助。 –