[MySQL] Einfacher Join: Ganze Tabelle wird gescannt

Veränderung

Erfahrenes Mitglied
Ich habe ein Problem mit einer Abfrage, die sehr viel Performance verursacht. Ich habe sowohl die Abfrage, als auch den Test-Dump auf das Problem beschränkt, im Dump sind zwei Tabellen die mit einem simplen Join abgefragt werden sollen.

Problem: Die EXPLAIN-Abfrage zeigt, dass alle Zeilen aus der team-Tabelle gelesen werden. Warum ist das so? Ich habe doch alle nötigen Indizes gesetzt.

Abfrage:
Code:
SELECT
wetten.id
FROM
wetten_wetten AS wetten
INNER JOIN wetten_wetten_teams AS wt1 ON wt1.wette=wetten.id
LIMIT 5
(Ich habe ebenfalls andere Join-Arten und normale Select-Verknüpfung probiert.)

Kleiner Dump mit den Tabellen zum Reproduzieren

Freue mich über jede Hilfe!
 
Mit deinem Beispiel nimmt er den Key 'wette'
Code:
id | select_type | table  | type   | possible_keys | key     | key_len | ref            | rows | Extra
---------------------------------------------------------------------------------------------------------
1  |SIMPLE       | wt1    | index  | wette         | wette   | 4       | _NULL_         | 64   | Using index
1  |SIMPLE       | wetten | eq_ref | PRIMARY       | PRIMARY | 4       | test.wt1.wette | 1    | Using index
 
Hai :)

Ich bin mir nicht ganz sicher, ob ich die Situation ganz überblicke, aber vielleicht könntest du die Bedienung nach dem "ON"-Teil weiter einschränken. Wenn du da Indizies gesetzt hast, dann könntest du nicht nur nach dem PK-FK Schlüssel abfragen, sondern auch nach ihnen.
Sowas wie:

INNER JOIN wetten_wetten_teams AS wt1
ON wt1.wette=wetten.id
AND "Indizien vergleichen"
 
Ich habe keine weiteren Indizes gesetzt (außer wt1.wette und wetten.id) und auch keine weiteren Einschränkungsbedingungen für die Bedingungen.
Oder ich verstehe dein Vorschlag falsch. ;)
 
Hallo,

ein paar Monate sind ins Land gezogen und ich habe leider immer noch keine Lösung für dieses im Prinzip einfach nachzutestende Problem. Inzwischen macht die Anwendung bei mir in den Tabellen mehrere tausend Zeilen aus und so ist es leider mit diesem Query eine sehr langsame Angelegenheit, weil immer wieder die ganze Tabelle gescannt wird, obwohl ich nur 5 Zeilen brauche.

Auch dieser umgestellte Query erzeugt jedes Mal einen Fullscan und hat bei EXPLAIN eine null-Angabe bei ref:
Code:
SELECT
wetten.id
FROM
wetten_wetten AS wetten, wetten_wetten_teams AS wt1 
WHERE wetten.id=wt1.wette 
LIMIT 5
Woran könnte das nur liegen? :(
 
Zeig mal was für Indexe du hast. Ein Fulltablescan kann man mWn nur mit Indexen verhindern.
ggf mit USE INDEX oder FORCE INDEX einen Index angeben der gewählt werden soll (näheres dazu findest du in der MySQL-Doku).

Zum Null bei Ref. Die Ref ist ja in der anderen Zeile bereits defiert. So wie ich das sehe steht dort die Referenz von der Chield-Table zur Parent-Table und nicht umgekehrt.
 
Zurück