0

我有一个非常庞大的产品和用户数据集以及他们的使用时间。

大约有 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

此查询需要永远运行。

其次,我还想将用户 ID 11 4 和用户 ID 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

这个脚本也需要无限的时间。

请帮忙,

谢谢你

4

1 回答 1

0

而不是 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 条件,而内部联接用作单个关系..

而不是一列的多个索引,您应该删除这些索引并创建一个复合索引,左侧是连接条件所涉及的列,右侧是其他列

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)>=1
于 2019-01-20T14:54:44.533 回答