Ускорение большого mysql присоединения - PullRequest
0 голосов
/ 24 марта 2020

Я пишу sql, чтобы каждый день перечислять активного пользователя с его первой датой появления в таблице журнала. Версия MySQL - 5.7 .

Как:

date           active_users    reg_date
2020-03-1        user1        2019-02-01
2020-03-1        user2        2019-03-04
2020-03-2        user3        2019-01-18
2020-03-2        user1        2019-02-01

Я выполнил запрос для достижения этой цели, но, как показано, я сделал 2 агрегации для той же таблицы, а затем соединить их вместе ... Таблица журнала входа game_user_log содержит 2 million строк данных, и я добавил индекс для столбцов data_date и data_date, но мой запрос занимает около 1 minute.

Есть ли способ оптимизировать и ускорить запрос? Любая помощь приветствуется.

Это мой запрос:

SELECT a.data_date, a.user_id, b.reg_date 
              -- List every day and de-duplicated users
from ( SELECT distinct data_date, user_id 
       from `game_user_log`) a
              -- Get the first login date as reg_date
left outer join ( SELECT user_id, min(data_date) reg_date 
                  FROM `game_user_log` 
                  GROUP BY user_id) b
    on a.user_id=b.user_id

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Я бы написал ваш запрос как:

select du.data_date, du.user_id, u.reg_date 
from (select distinct data_date, user_id 
      from game_user_log
     ) du join
     (select user_id, min(data_date) as reg_date 
      from game_user_log
      group by user_id
     ) u
     on du.user_id = u.user_id;

Для этого запроса вы можете попробовать индекс на game_user_log(user_id, data_date).

0 голосов
/ 24 марта 2020
SELECT data_date,
       user_id, 
       MIN(data_date) OVER (PARTITION BY user_id) reg_date 
FROM game_user_log
GROUP BY data_date, user_id

?

PS. Индекс на (user_id, data_date) необходим для ускорения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...