1

我有一个 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,每天访问量超过 100k。在这种情况下,在表slow_log 中注册这些查询的权重具有较大的生成时间。

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

表引擎是 MyISAM。

4

1 回答 1

2

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

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

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

于 2010-03-09T10:31:25.977 回答