Могу ли я сделать этот MySQL-тест со сложными СЧЕТАМИ более эффективным?

0

У меня есть таблица всех игр Бейсбола Высшей лиги, которая структурирована следующим образом:

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

Проблема в том, что этот запрос очень медленный. Я проиндексировал все столбцы в таблице игр и все, за исключением цены в таблице билета, но это все еще очень медленно.

Кто-нибудь может предложить, как я могу ускорить это?

Теги:

1 ответ

1
Лучший ответ

Я думаю, что подзапрос подкаста в выражении 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню