2009-07-08 2 views
0

ich es wirklich schätzen würde, wenn einige von Ihnen helfen können, meine Tabellen zu optimieren, da sie zur Zeit extrem lange dauern, weil der folgenden Probleme auszuführen:MySQL - Bitte helfen Sie mit Optimierung, bin ich nicht sicher, wie

Haupttisch :

game { 
    game_id [PRIMARY KEY] 
    *team_id 
    *stadium_id 
    home_score 
    opponent_score 
    date 
    tour 
    half_home_score 
    half_opp_score 
    attendance 
    referee_id 
    coach_id 
    captain_id 
} 

players (contains all players that played in the game) { 
    *game_id 
    *team_id 
    *player_id 
    position 
    number 
} 

tries, conversions, penalties, dropgoals { 
    *player_id 
    *game_id 
    *team_id 
} 

team { 
    team_id [PRIMARY KEY] 
    country 
} 

player { 
    player_id [PRIMARY KEY] 
    *team_id 
    name 
    surname 
    fullname 
    DOB 
    POB 
    school 
    height 
    weight 
    position 
} 

ich neige dazu, alle mit * _id der vom Typ (UNSIGNED INT [5]) zu machen? Ich bin ein bisschen unsicher, ob UNSIGNED

benötigt wird Der gesamte Text wird VARCHAR (500..200) in Abhängigkeit von der

Ich benutze DATE Typ benötigt Größe, wo ich kann zB. DOB, Datum

‚*‘ - bezieht sich auf Fremdschlüssel,

Eine Seite in anderen Tabellen Primärschlüssel sind besonders langsam, was passiert, ist die folgende:

Die Seite zeigt die Aufstellung der Spieler für das spezifische Spiel so sind meine Fragen die folgenden: id getTries (player_id, game_id) aus versucht

SELECT alle player_id ist, Anzahl, die Position von Spielern Tabelle WHERE game_id bestimmten Spiel der Tabelle ist . . getDropgoals (player_id, game_id) aus dropgoals Tabelle

getPlayerName (player_id) von Spieler Tabelle

Ausgabe auf Tabelle die empfangenen Details

<tr> 
<td>tries</td>...<td>dropgoals</td><td>position</td><td>player's name</td><td>number</td></tr> 

Ich würde es wirklich schätzen, wenn jemand darauf hinweisen könnte einige sichtbare Fallstricke.

Grüße

// bearbeiten

ich die folgende Abfrage verwendet haben, aber es gibt nur die Zeilen, die in der Tabelle versucht gefunden, ich es ausgeben möchten alle Spieler gefunden, aber nur die Zahl zählen Wenn er für diesen Spieler keine Versuche erzielte, muss er immer noch die Spielerdetails ausgeben, aber 0 für Versuche.

Ich bin nicht sicher, ob meine Frage richtig: SELECT ps.player_id, ps.position, ps.number, p.name, p.surname, COUNT (*) AS triesNo FROM Spieler ps, Spieler p, versucht WO p.player_id = ps.player_id UND ps.game_id = '$ game_id UND ps.team_id ist null und tries.player_id = ps.player_id GROUP BY ps.player_id ORDER BY ps.number

ich möchte es auch Zurückgeben eines Spielers, wenn er keine Versuche erzielt hat. Jetzt gibt er den Spieler nur zurück, wenn er einen Versuch erzielt hat.

Kann mir bitte jemand helfen?

+5

Wie über die SQL Sie optimieren möchten veröffentlichen und die Ausgabe von EXPLAIN SELECT ... – Greg

+0

scheint Ihre Struktur ziemlich geradlinig. Wie von Greg erwähnt, geben Sie spezifische Abfragen an, die langsam ausgeführt werden. Stellen Sie außerdem die Spalten mit Indizes bereit. – safoo

Antwort

1

Von den Klängen der es Ihnen sein kann (a) zu viele Abfragen auf einer Seite Last ausgeführt wird, oder (b) keine Daten auf entsprechenden Felder verbinden, wenn Sie aus mehreren Tabellen auf einmal sind die Auswahl.

Zum Beispiel von dem, was Sie gesagt haben, erscheinen Sie eine ganze Reihe von Abfragen zu bekommen läuft Spielernamen zu bekommen, aber Sie können wie so dass mit dem ersten Abfrage fusionieren:

SELECT ps.player_id, ps.position, ps.number, p.name 
FROM players ps, player p 
WHERE p.player_id=ps.player_id 

Diese Abfrage verknüpft zwei Tabellen auf der player_id, und Sie am Ende mit einer Reihe von Spielern mit ID/Position/Nummer/Name.

Sie können sich auch in Indizes suchen. Es empfiehlt sich, alle in einer WHERE-Klausel verwendeten Felder zu indizieren (die noch nicht mit einem Primärschlüssel indiziert sind).

Wie andere haben, sagte, werden Sie spezifischere mit sein, was Abfragen langsam ausgeführt werden.

+0

Vielen Dank für Ihre konstruktive commment, wie ich über verschmelzenden Anfragen wie das vergessen habe, sauber, werde ich versuchen, dies jetzt zu tun, und mit einigen Abfragen zurückkommen, die noch langsam ausgeführt werden. –

0

Unsigned wird Ihnen ermöglichen, eine größere (doppelte Größe) ID-Spalte zu haben. Der Nachteil wäre, dass Sie keine negativen IDs verwenden können (was sowieso böse ist).

+0

Aber hat unsigned in irgendeiner Weise Einfluss auf die Ausführungsgeschwindigkeit? –

+0

Ich bezweifle es sehr. –