2009-07-23 6 views
0

J'ai une table de tous Major League jeux de base-ball qui est structuré comme celui-ci:Est-ce que je peux rendre ce compte MySQL avec COUNTs plus efficace?

**Game** 
id (int) 
home_team_id (int) 
away_team_id (int) 
home_score (int) 
away_score (int) 
date (date) 

J'ai aussi table nommée "ticket" qui a des billets vendus à différents jeux:

**Ticket** 
id (int) 
game_id (int) 
price (float) 
time_sold (datetime) 

Je d aimer exécuter une requête MySQL qui, pour chaque liste de tickets, correspond à l'enregistrement de l'équipe au domicile et à l'extérieur au moment où le billet a été vendu. J'ai utilisé ceci:

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 

Le problème est que cette requête est extrêmement lente. J'ai indexé toutes les colonnes dans la table de jeu et tout sauf le prix dans la table des tickets, mais c'est toujours douloureusement lent. Est-ce que quelqu'un peut suggérer comment je peux accélérer cela?

Répondre

1

Je pense que la sous-requête select scalaire dans la clause SELECT pourrait être le coupable. J'essaierais de le déplacer vers la clause FROM.

Essayez et voir si ça aide (je pourrais avoir des erreurs de syntaxe, je n'ai pas un environnement pour tester aujourd'hui):

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 
Questions connexes