使用IN运算符优化MySQL查询

使用IN运算符优化MySQL查询,sql,mysql,optimization,myisam,Sql,Mysql,Optimization,Myisam,我有一个MySQL数据库,其中有一个相当大的表,其中包含产品。每个产品都有自己的id和categoryId字段,其中有属于此产品的类别id。现在我有一个查询,可以从给定类别中提取产品,例如: SELECT * FROM products WHERE categoryId IN ( 1, 2, 3, 4, 5, 34, 6, 7, 8, 9, 10, 11, 12 ) 当然,这里有WHERE子句和排序,但不是在这个东西中。假设这些产品有25万台,每天的访问量超过10万台。在这种情况下,表中的sl

我有一个MySQL数据库,其中有一个相当大的表,其中包含产品。每个产品都有自己的id和categoryId字段,其中有属于此产品的类别id。现在我有一个查询,可以从给定类别中提取产品,例如:

SELECT * FROM products WHERE categoryId IN ( 1, 2, 3, 4, 5, 34, 6, 7, 8, 9, 10, 11, 12 )
当然,这里有WHERE子句和排序,但不是在这个东西中。假设这些产品有25万台,每天的访问量超过10万台。在这种情况下,表中的slow_log记录了这些查询的权重,生成时间较长

你对如何优化给定的问题有什么想法吗


表引擎是MyISAM。

categoryId上的索引在这种情况下没有帮助,在(…)中,查询将生成序列扫描,而不是索引查找

我会考虑首先重新设计系统以消除多个类别选择,如果不合适,缓存查询结果。


例如,您可以创建一个helper表items\u category\u groups(散列,item\u id),并在客户端查询多个类别后散列它们的组合id并查找此表。如果找不到,请进行昂贵的查询并填写此表。如果找到,进行一个廉价的查询来连接这些表。其他缓存工具,如memcached,也可以使用。

好主意,但此查询用于提取给定类别及其子类别(此类别的整个分支)的产品,因此这是不可能的。缓存是我看到的唯一方法,尽管缓存大小会很大(250k*类别组合计数),所以我将它们存储在DB中,不在memcache或其他文件中。如果您只想从一个类别(及其子类别)中提取产品,您可以创建一个帮助表(category_id,item_id),并用包括子类别在内的所有category_id-item_id对填充它。这个表不会很大(比如说,如果你的分类级别为4,它将包含不超过1m*的两行整数的分类数,这没什么大不了的)。然后,您将使用索引通过单个快速查询获取产品。我还必须在助手表中使用。例如,类别1包含子类别2,类别2包含子类别3。第1项属于第3类。然后,您将在该表中为一个项目设置3行:11 | 12 | 13,如果您想从类别2中选择所有项目,请大致写下:选择项目。*从项目i,项目类别ic,其中i.id=ic.item|u id和ic.category_id=2;它将等于从(2,3)中的类别id所在的项目中选择*;当然,如果您想从两个不相关的类别中选择项目,这将不起作用,但在嵌套类别的情况下,它将起作用。您确实在
categoryId
上有索引,对吗?