使用IN运算符优化MySQL查询

时间:2010-03-09 10:23:46

标签: 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子句和ORDER BY排序但不是这个。假设这些产品是250k,每天的访问量超过10万。在这种情况下,表slow_log注册了这些查询的权重,具有较大的生成时间。

您对如何优化给定问题有任何想法吗?

表引擎是MyISAM。

1 个答案:

答案 0 :(得分:2)

classId上的索引在这种情况下无效,IN(...)查询无论如何都会生成序列扫描而不是索引查找。

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

例如,您可以创建帮助程序表items_category_groups(hash,item_id),并在客户端查询多个类别后对其组合ID进行哈希并查找此表。如果找不到,请进行昂贵的查询并填写此表。如果找到,请加入这些表格进行廉价查询。其他缓存工具(如memcached)也可以使用。