2009-07-23 8 views
0

Ich habe eine Tabelle aller Major League Baseball-Spiele, die wie folgt strukturiert:Kann ich diese MySQL-Anweisung mit komplexen COUNTs effizienter machen?

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

Ich habe auch Tabelle "Ticket" genannt, die verkauften Tickets für verschiedene Spiele hat:

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

I‘ d möchte eine MySQL-Abfrage ausführen, die für jeden Ticketeintrag den Eintrag des Heim- und Auswärtsteams zum Zeitpunkt des Verkaufs des Tickets entspricht. Ich benutze dies:

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 

Das Problem ist, dass diese Abfrage extrem langsam ist. Ich habe alle Spalten in der Spieltabelle und alle außer dem Preis in der Tickettabelle indiziert, aber es ist immer noch schmerzhaft langsam.

Kann jemand vorschlagen, wie ich das beschleunigen kann?

Antwort

1

Ich denke, die skalare SELECT-Unterabfrage in der SELECT-Klausel könnte der Schuldige sein. Ich würde versuchen, es in die FROM-Klausel zu verschieben.

Versuchen Sie dies und sehen, ob es hilft, (ich könnte Syntaxfehler habe ich heute keine Umgebung zu testen):

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 
Verwandte Themen