Query Optimierung

Hallo Zusammen!

Ich habe ein Query gebastelt, das leider langsam eine etwas lange Arbeitszeit hat.
Es braucht 15s bis es auf der Datenbank die 238'000 Datensätze durchgerattert hat.

Wie kann ich es Optimieren ? Oder was könnte mir helfen, damit ich es schneller durchrattern kann ?

Code:
SELECT alarmeedlanlagen.DatumZeit, alarmeedlanlagen.DMSName, anlagen.BEZEICHNUNG, anlagenstationen.BEZEICHNUNG, alarmeedlanlagen.Objektname, alarmZustaende.bezeichnung, alarmeedlanlagen.Prioritaet, alarmeedlanlagen.Nummer
FROM alarmeedlanlagen
LEFT JOIN anlagenstationen ON alarmeedlanlagen.Anlage = anlagenstationen.BEZEICHNUNG_KURZ
LEFT JOIN anlagen ON anlagen.ID_ANLAGEN = anlagenstationen.ID_ANLAGEN
LEFT JOIN alarmZustaende ON alarmZustaende.ID_alarmZustaende = alarmeedlanlagen.Zustand
LEFT JOIN anlagen_firma ON anlagen.ID_ANLAGEN = anlagen_firma.ID_ANLAGEN
GROUP BY alarmeedlanlagen.DatumZeit
ORDER BY alarmeedlanlagen.DatumZeit DESC , alarmeedlanlagen.DMSName DESC
LIMIT 0 , 300;

Danke schon im vorraus.

Gruess

Ruth
 
Hallo Ruth,

ein paar Fragen die sich ergeben:

1. Wieviele Datensätze sind pro Tabelle enthalten
2. Sind alle Tabellen mit den richtigen Spalten indiziert?
3. Sind alle Left-Outer-Joins nötig oder können sie evtl. durch Inner-Joins ersetztz werden?

Markus
 
1. Wieviele Datensätze sind pro Tabelle enthalten

alarmeedlanlagen: 239.055
anlagenstationen:154
anlagen:76
alarmZustaende:3
anlagen_firma: 5

2. Sind alle Tabellen mit den richtigen Spalten indiziert?

Ja denke schon, hab mal noch das ERM angehängt, ist dumm das alarmeedlanlagen keine ID hat, kann des aber nicht ändern, da ein C-Programm da rein schreibt und das sonst angepasst werden müsste.

3. Sind alle Left-Outer-Joins nötig oder können sie evtl. durch Inner-Joins ersetztz werden ?

Mal ne blöde Frag, wann kann ich einen Left-Outer Join weglassen und ihn in einen Inner Join umsetzen ? Kenn mich da nicht so aus mit den Join abfragen ?
 

Anhänge

  • ERM.jpg
    ERM.jpg
    36,5 KB · Aufrufe: 29
Danke für den Tipp mit den JOINS :)
Hab jetzt bis auf den ersten LEFT JOIN alle JOINS in INNER JOINS gewandelt.
Die Abfrage hat jetzt noch 9 s, habe ich noch andere Möglichkeiten ?
 
Biite ;)

allerdings musst du schon prüfen, ob die Felder alle Pflichtfelder sind oder nicht auch mal NULL sein können, bevor du aus LEFT JOINs einfach INNER JOINs machst. Das siehst du ja am besten ander Tabellendefinition.

Ansonsten würde ich mal ein EXPLAIN machen. Also einfach deiner SQL-Abfrage ein EXPLAIN voranstellen. Dann kannst du schauen, ob Indizes verwendet werden usw. Kannst die Ausgabe ja mal posten.

Markus
 
Jo denke das mit den Pflichtfeldern geht in Ordnung habe jedenfalls gleich viele Datensätze wie vorher erhalten.

Index verwende ich bis anhin keine. Dachte das bringt nur was für die Volltextsueche. Über welche Spalten macht es Sinn einen Index zu legen ?

Hab mal ein Explain gemacht und es in den Anhang gehängt. Die letzte Zeile hat leider nicht ganz ins Bild gepasst. Falls diese wichtig ist, liefer ich sie noch nach.

Gruess

Ruth
 

Anhänge

Mhm, kenn mich mit MySQL nun nicht so gut aus, aber:

Fullscan, Temporary sindt sicher keine gute Sachen und die Performance wird mit steigender Datenmenge immer schlechter.

Müssen es denn immer genau die 300 neuesten Datensätze sein? Wäre eine Abfrage nach einem bestimmten Datumsbereich, z.B. die letzten 7 Tage nicht auch sinnvoll? Denn dann könntest du die Datumsspalte indizieren und es würde nur noch ein Range-Scan durchgeführt.

Markus
 
Also die Seite ist so aufgebaut, dass es ein Archiv von Alarmen ist, dass eine Blätterfunktion hat. Deshalb arbeite ich mit Limit. Die Idee ist gut mit dem Index über dem Datum aber denke, dass macht nicht grossen Sinn in meinem Fall, des nach Datum aufzuteilen. Vorallem weil sämtliche anderen Seiten ebenso aufgebaut sind.

Hab gerade gesehen der Kollege von mir der dieses Programm geschrieben hat. Der hat bereits nen index über die DatumZeit Spalte und den DMSName gelegt. Gibt da wohl mit Indexes nicht mehr viel zu machen.

Könnte man eventuell durch ne View schneller werden ?

Gruess

Ruth
 
Zuletzt bearbeitet:
Hi
also noch mehr Performance erhällst du wenn du für diese zwei Felder einen Index erstellst (geht ganz einfach mit dem MySQL Query Browser)

alarmeedlanlagen.DatumZeit
alarmeedlanlagen.Anlage
anlagen.ID_ANLAGEN
anlagen_firma.ID_ANLAGEN


Dann würde ich mal schauen, ob du nicht später in alarmeedlanlagen joinen kannst (wenn möglich ganz am Schluss) Obwohl mit den Indexen würdest du da nicht mehr viel rausholen können.

Gruss
 
Zurück