我有一个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 sort,但不是在这里。假设这些产品是250k,每天的访问量超过100k。在这样的条件下,slow_log在表中注册了这些具有较大生成时间的查询的权重。
你有任何想法如何优化给定的问题吗?
表引擎为MyISAM。
发布于 2010-03-09 18:31:26
在这种情况下,categoryId上的索引将不起作用,in (...)查询将生成序列扫描,而不是索引查找。
我会考虑首先重新设计系统,去掉多个类别选择,如果不合适,则缓存查询结果。
例如,您可以创建一个items_category_groups( hash,item_id)帮助器表,在客户端查询多个类别之后,散列它们的组合ids并查找该表。如果找不到,则执行代价高昂的查询并填写此表。如果找到,则执行一个连接这些表的廉价查询。其他缓存工具,如memcached也可以使用。
https://stackoverflow.com/questions/2408250
复制相似问题