У меня есть цифровой тестовый сервер Ocean, который имеет Ubuntu 14.04 и MySQL версии 5.5. С другой стороны, мой рабочий сервер — Ubuntu 16.04, а версия mysql — 5.7. У меня есть этот запрос на обновление
UPDATE paid_cricduel.fantasy_teams t
join (select ft.fantasy_team_id,
ft.team_captain_id,
sum((case
when ft.team_captain_id = ccp.cricket_contest_player_id then 2
when ft.team_vc_id = ccp.cricket_contest_player_id then 1.5
else 1
end) * ccp.player_points) as temp_total
from fantasy_teams as ft
join fantasy_team_players ftp on ft.fantasy_team_id=ftp.fantasy_team_id
join cricket_contest_players as ccp on ftp.cricket_contest_player_id = ccp.cricket_contest_player_id
where ft.cricket_contest_id=?
group by ft.fantasy_team_id) temp
set total_points = temp.temp_total
where temp.fantasy_team_id = t.fantasy_team_id
Этот запрос выполняется на моем тестовом сервере за 0,3 секунды, но на моем производстве он занимает не менее 25 секунд. Иногда даже 50+ секунд. Я пробовал разные решения, упомянутые при переполнении стека, но мне кажется, что ничего не работает.
Что делает запрос, так это то, что он берет очки игрока из другого стола, а затем выбирает игроков вашей команды из другого стола. Делает суммирование всех очков ваших игроков. Кроме того, если игрок является капитаном вашей команды, он умножает очки этого игрока на 1,5, если он вице-капитан, то на 1,2 в противном случае просто добавляет их как есть.
У меня были также индексы для столбца total_points и fantasy_team_id, но я удалил их, чтобы посмотреть, окажет ли это какое-либо влияние, но это не так.
Любая помощь?
Задача ещё не решена.
Других решений пока нет …