Я использую MySQL для своего проекта, и у меня более 20 миллионов записей в таблице "mixpanel_data".
Так что, когда я пытаюсь получить записи за последние 6 месяцев, это прерывает запрос. Он предоставляет мне только записи последних 5-10 дней
Я использую следующий запрос MySQL.
SELECT `sb_users`.`id`,`sb_users`.`name`, SUM(`mixpanel_data`.duration) as timeCount,
COUNT(`mixpanel_data`.spread_id) as PageCount,`mixpanel_data`.`language`,
`mixpanel_data`.`created_at`, `mixpanel_data`.`book_name`,
`mixpanel_data`.`email`, `mixpanel_data`.`ip_address`,
`mixpanel_data`.`event_date`, `mixpanel_data`.`type`,
'Read', `mixpanel_data`.`unique_session_id`, `mixpanel_data`.`operating_system`,
`mixpanel_data`.`country`, `mixpanel_data`.`region`, `mixpanel_data`.`city`,
`mixpanel_data`.`device`, `mixpanel_data`.`browser`,
`mixpanel_data`.`browser_version`
FROM `mixpanel_data`
LEFT JOIN `sb_users` ON `mixpanel_data`.`first_name` = `sb_users`.`username`
WHERE `mixpanel_data`.`email` !=''
AND `mixpanel_data`.`created_at` Between '2019-03-24' AND '2020-03-24'
and `mixpanel_data`.`action` IN('PauseAudio')
GROUP BY `mixpanel_data`.`email`, `mixpanel_data`.`book_name` ,
`mixpanel_data`.`language`
UNION
SELECT `sb_users`.`id`,`sb_users`.`name`, SUM(`mixpanel_data`.duration) as timeCount,
COUNT(`mixpanel_data`.spread_id) as PageCount,`mixpanel_data`.`language`,
`mixpanel_data`.`created_at`, `mixpanel_data`.`book_name`,
`mixpanel_data`.`email`, `mixpanel_data`.`ip_address`,
`mixpanel_data`.`event_date`, `mixpanel_data`.`type`,
'Read', `mixpanel_data`.`unique_session_id`, `mixpanel_data`.`operating_system`,
`mixpanel_data`.`country`, `mixpanel_data`.`region`, `mixpanel_data`.`city`,
`mixpanel_data`.`device`, `mixpanel_data`.`browser`,
`mixpanel_data`.`browser_version`
FROM `mixpanel_data`
LEFT JOIN `sb_users` ON `mixpanel_data`.`first_name` = `sb_users`.`username`
WHERE `mixpanel_data`.`email` !=''
AND `mixpanel_data`.`created_at` Between '2019-03-24' AND '2020-03-24'
and `mixpanel_data`.`action` NOT IN('PlayAudio','PauseAudio')
AND `mixpanel_data`.`spread_id` !=''
GROUP BY `mixpanel_data`.`email`, `mixpanel_data`.`book_name` ,
`mixpanel_data`.`language`
Я пытался изменить свой запрос следующим запросом, но это не работает для меня. Это также нарушает запрос и также дает мне меньше записей.
SELECT sb_users.id,
sb_users.NAME,
Count(mixpanel_data.spread_id) AS PageCount,
SUM(CASE When action IN ('PauseAudio') Then duration Else 0 End) as total, SUM(CASE When action NOT IN ('PlayAudio', 'PauseAudio') Then duration Else 0 End) as Sectotal,
mixpanel_data.language,
mixpanel_data.created_at,
mixpanel_data.book_name,
mixpanel_data.email,
mixpanel_data.ip_address,
mixpanel_data.event_date,
mixpanel_data.type,
'Read',
mixpanel_data.unique_session_id,
mixpanel_data.operating_system,
mixpanel_data.country,
mixpanel_data.region,
mixpanel_data.city,
mixpanel_data.device,
mixpanel_data.browser,
mixpanel_data.browser_version
FROM `mixpanel_data`
LEFT JOIN sb_users
ON `mixpanel_data`.`first_name` = `sb_users`. `username`
WHERE
mixpanel_data.email != '' AND mixpanel_data.`created_at` Between '2019-03-24' AND '2020-03-24'
AND `mixpanel_data`.`spread_id` !='' GROUP BY mixpanel_data.email,
mixpanel_data.book_name,
mixpanel_data.language
Я также попытался добавить индексатор для столбца first_name, username и made_at. Но запрос занимает много времени (более 15-16 секунд)
Может ли кто-нибудь помочь мне оптимизировать запрос?