Mysql-запрос все еще замедляется для 100 миллионов записей в размере 10 ГБ базы данных с индексом - PullRequest
0 голосов
/ 20 января 2019

У меня довольно большой набор данных о продуктах и ​​пользователях и времени их использования.

Имеется около 100 миллионов строк и занимает около 10 ГБ дискового пространства.

набор данных находится в следующем порядке:

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 голосов
/ 20 января 2019

Вместо предложения 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 работает как условие нескольких ИЛИ, а внутреннее объединение работает как одно отношение.

И Вместо нескольких индексов с одним столбцом вы должны удалить этот индекс и создать составной индекс со столбцом, включенным в условие соединения слева, и другим столбцом справа

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
...