2009-07-23 6 views
0

私はこのように構成されているすべてのメジャーリーグの試合のテーブルを持っている:複雑なCOUNTを持つこのMySQLステーションをより効率的にすることはできますか?

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

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 

(私がテストした環境は本日を持っていない私は、構文エラーがある可能性があります)、これを試してみて、それが助けかどうかを確認

関連する問題