我有一张表tbl_ratings,大约有1亿条记录。每条记录是用户对项目的评级。可以将其视为整组项目向量,每个向量包含一些user_id维度的评级。我的目标是计算每对矢量之间的平均差异(在匹配的维度上)。我试图通过加入自身来做到这一点,但由于某种原因它忽略了我的两个索引。
CREATE TABLE tbl_ratings
(
user_id MEDIUMINT UNSIGNED NOT NULL,
item_id MEDIUMINT UNSIGNED NOT NULL,
rating TINYINT NOT NULL,
UNIQUE KEY user_index (user_id,item_id,rating) USING HASH,
UNIQUE KEY item_index (item_id,user_id,rating) USING HASH
) ENGINE=MEMORY;
EXPLAIN
SELECT a.item_id as active_id,
n.item_id as neighbor_id,
AVG(a.rating-n.rating) as intercept,
COUNT(a.rating) as overlap
FROM tbl_ratings as a # active vectors
JOIN tbl_ratings as n # neighbor vectors
ON a.user_id=n.user_id
GROUP BY a.item_id, n.item_id \G
*************************** 1. row ***************************
id : 1
select_type : SIMPLE
table : a
type : ALL
possible_keys: user_index
key : NULL
key_len : NULL
ref : NULL
rows : 100480507
Extra : Using temporary; Using filesort
*************************** 2. row ***************************
id : 1
select_type : SIMPLE
table : n
type : ALL
possible_keys: user_index
key : NULL
key_len : NULL
ref : NULL
rows : 100480507
Extra : Using where; Using join buffer (Block Nested Loop)
答案 0 :(得分:0)
正如其他人所说,要么改变为BTree索引(其中user_id是第一个字段,所以用户的所有条目将聚集在一起),或者仅在user_id连接字段上使用非唯一的哈希索引。没有其他选择。