我有一个非常庞大的产品和用户及其使用时间的数据集。
大约有1亿行,并占用了大约10 GB的磁盘空间。
数据集的顺序如下:
userid itemid purchase_date
1 1 2018-12-22
11 1 2018-12-22
11 4 2018-12-22
12 4 2018-12-22
11 5 2018-12-22
.......100M+ rows.....
我也添加了这样的索引
ALTER TABLE purchase_data ADD INDEX (userid);
ALTER TABLE purchase_data ADD INDEX (itemid);
ALTER TABLE purchase_data ADD INDEX (purchase_date);
假设我要查找所有购买了某商品(项目1)的用户,然后查找他购买的所有其他商品。
Select itemid from purchase_data
where userid in (Select userid, from purchase_data
where itemid=1)
and itemid!=1
此查询永远需要运行。
第二,我还想将这些用户之间的所有通用项加起来,例如userid 11 4和userid 12也带来了4,所以我想加4的数量为2
我为此写了一个类似的查询
Select itemid,count(*) from purchase_data
where userid in (Select userid, from purchase_data
where itemid=1)
and itemid!=1
group by itemid
having count(itemid)>=1
此脚本还需要无限的时间。
请帮助
谢谢
答案 0 :(得分:0)
您应该使用内部联接来代替IN子句,例如:
[train + validation]
IN子句用作多个OR条件,而内部联接则作为单个关系..
然后 您应该删除这些索引,而不要创建多个索引,而要创建一个复合索引,其中涉及连接条件的列在左侧,而其他列在右侧
Select itemid
from purchase_data a
INNER JOIN (
Select userid
from purchase_data where itemid=1
) T on t.userid = a,userid
where a.itemid != 1
与分组查询相同
create index my_idx on purchase_data(userid, itemid );