大规模连接不使用索引

时间:2014-10-22 23:21:04

标签: mysql sql

我有一张表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)

1 个答案:

答案 0 :(得分:0)

正如其他人所说,要么改变为BTree索引(其中user_id是第一个字段,所以用户的所有条目将聚集在一起),或者仅在user_id连接字段上使用非唯一的哈希索引。没有其他选择。