У меня есть таблица всех игр Бейсбола Высшей лиги, которая структурирована следующим образом:
**Game**
id (int)
home_team_id (int)
away_team_id (int)
home_score (int)
away_score (int)
date (date)
У меня также есть таблица с названием "билет", в которой есть билеты, проданные в разные игры:
**Ticket**
id (int)
game_id (int)
price (float)
time_sold (datetime)
Я хотел бы запустить MySQL-запрос, который для каждого списка билетов соответствует домашней и гостевой команде в то время, когда был продан билет. Я использовал это:
SELECT ticket.id, game.home_team_id AS Home, game.away_team_id AS Away,
(SELECT COUNT(game.id) FROM game WHERE game.date < DATE_SUB(ticket.time_sold, INTERVAL 1 DAY) AND (game.home_score > game.away_score AND game.home_team = Home OR game.away_score > game.home_score AND game.away_team = Away)) as home_team_wins
FROM ticket
JOIN game
ON game.id = ticket.game_id
Проблема в том, что этот запрос очень медленный. Я проиндексировал все столбцы в таблице игр и все, за исключением цены в таблице билета, но это все еще очень медленно.
Кто-нибудь может предложить, как я могу ускорить это?
Я думаю, что подзапрос подкаста в выражении SELECT может быть виновником. Я бы попытался переместить его в предложение FROM.
Попробуйте это и посмотрите, помогает ли это (у меня могут быть синтаксические ошибки, у меня нет среды для тестирования сегодня):
SELECT ticket.id
, game.home_team_id AS Home
, game.away_team_id AS Away
, game_count
FROM (SELECT COUNT(game.id) as game_count FROM game WHERE game.date < DATE_SUB(ticket.time_sold, INTERVAL 1 DAY AND (game.home_score > game.away_score AND game.home_team = Home OR game.away_score > game.home_score AND game.away_team = Away))) as home_team_wins
,ticket JOIN game ON game.id = ticket.game_id