我有一个 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 排序,但不是在这个东西中。假设这些产品有25万,每天的访问量超过10万。在这种情况下,slow_log 表中记录了这些具有较大生成时间的查询的权重。
您对如何优化给定问题有任何想法吗?
表引擎是MyISAM。
最佳答案
在这种情况下,categoryId 上的索引不会有帮助,IN (...) 查询无论如何都会产生序列扫描而不是索引查找。
我会考虑首先重新设计系统以摆脱多个类别选择,如果不合适,则缓存查询结果。
例如,您可以创建一个辅助表 items_category_groups(hash, item_id),并在客户端查询多个类别后散列它们的组合 id 并查找此表。如果没有找到,则进行一次昂贵的查询并填充此表。如果找到,则进行一个连接这些表的廉价查询。其他缓存工具(例如 memcached)也可以使用。
关于sql - 使用 IN 运算符优化 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2408250/