我有一个rating
略少于 300k 行的表和一个 SQL 查询:
SELECT rt1.product_id as id1, rt2.product_id as id2, sum(1), sum(rt1.rate-rt2.rate) as sum
FROM rating as rt1
JOIN rating as rt2 ON rt1.user_id = rt2.user_id AND rt1.product_id != rt2.product_id
group by rt1.product_id, rt2.product_id
LIMIT 1
问题是..它真的很慢。执行它需要 36 秒limit 1
,而我需要无限制地执行它。正如我所知道的,它的减速是由GROUP BY
部分引起的。无论来自哪个表 rt1 或 rt2,它在按一列分组时都可以正常工作。我也尝试过使用索引,我已经为 user_id、product_id、rate 和(user_id、product_id)创建了索引。
EXPLAIN
也没有告诉我太多。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE rt1 ALL PRIMARY,user_id,user_product NULL NULL NULL 289700 Using temporary; Using filesort
1 SIMPLE rt2 ref PRIMARY,user_id,user_product user_id 4 mgrshop.rt1.user_id 30 Using where
我只需要执行一次以生成一些数据,因此实现最佳时间并不重要,但合理。
有任何想法吗?
编辑。
全表架构
CREATE TABLE IF NOT EXISTS `rating` (
`user_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`rate` int(11) NOT NULL,
PRIMARY KEY (`user_id`,`product_id`),
KEY `user_id` (`user_id`),
KEY `product_id` (`product_id`),
KEY `user_product` (`user_id`,`product_id`),
KEY `rate` (`rate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;