我有一个相当庞大的数据集,里面有产品和用户以及他们的使用时间。
大约有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);假设我想要找到所有购买了某个产品( item 1)的用户,然后找到他购买的所有其他项目。
Select itemid from purchase_data
where userid in (Select userid, from purchase_data
where itemid=1)
and itemid!=1此查询需要花费大量时间来运行。
其次,我还想将这些用户之间的所有公共项相加,比如userid11,4和userid12也带来了4,所以我想加上计数为2的4
为此,我编写了一个类似的查询:
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这个脚本也需要无限的时间。
请帮帮我
谢谢
发布于 2019-01-20 22:54:45
您应该使用内部联接而不是IN子句,例如:
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 IN子句用作多个OR条件,而inner join用作单个关系。
您应该删除这些索引,并创建一个复合索引,将连接条件中涉及的列放在左边,将others列放在右边,而不是只有一个列
create index my_idx on purchase_data(userid, itemid );分组查询也是如此
Select itemid , count(*)
from purchase_data a
INNER JOIN (
Select userid
from purchase_data where itemid=1
) T on t.userid = a,userid
where itemid != 1
group by itemid
having count(itemid)>=1https://stackoverflow.com/questions/54277633
复制相似问题