MySQL查询仍然会减慢10gb数据库大小和索引中的1亿条记录

时间:2019-01-20 14:50:45

标签: mysql database mariadb query-optimization semi-join

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

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

此脚本还需要无限的时间。

请帮助

谢谢

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 );