Ilja: [MySQL] 25-minütige SELECT-Abfrage mit 2 Tabellen beschleunigen?

Beitrag lesen

yo,

Ich habe durch die Indizierung außer dem erhöhten Speicherbedarf keine Nachteile.
Ist das soweit korrekt?

nein, grundsätzlich kannst du dir einen index als eigenes objekt in der datenbank vorstellen, das zusätzlich zu der tabelle angelegt wird. hinter diesen index objekten steckt letztlich eine sortierung, was eben den schnelleren zugriff zuläßt als bei einer tabelle, die in aller regel unsortiert ist. kommen neue datensätze in der tabele hinzu, werden welche gelöscht oder geändert passt das DBMS den index automatisch an, wie du ja selbst geschrieben hast. demzufolge ist ein index nicht umsonst zu haben, als faustregel gilt, er KANN abfragen beschleunigen, bringt aber einbußen beim löschen, einfügen und verändern von datensätzen. hinzukommt, dass der speicherbedarf je nach fall nicht gerade klein sein muss.

insofern macht macht es keinen sinn, deine tabelle mit indexen zu erschießen, das bringt unter dem strich oftmals nur nachteile. gefragt ist ein sinnvoller einsatz von indexen und anderen optimierungsmöglichkeiten. tunig ist letztlich die königsdisziplin bei datenbanken und ein schwieriges thema.

In der ersten Spalte steht jetzt immernoch type ALL.
Sollte das jetzt noch weg und wenn ja, irgendwelche Ideen wie das geht?

lass dich von den aussagen zuvor nicht auf die falsche fährte bringen. nur weil im explain ein ALL auftaucht muss dass noch lange nichts negatives sein. das ist reine panikmache.

noch ein paar tipps, grundsätzlich solltest du die explizite JOIN schreibeweise verwenden, nicht wegen der geschwindigkeit, sondern vor allem wegen der besseren lesbarkeit. zum anderen hast du ein DISTINCT in deiner abfrage zu stehen. es ist zu klären, ob du dies überhaupt brauchst, ob doppelte werte vorkommen können und wenn ja, ob die dann auch wegfallen sollen. und gibt es den werte in der ref_sp Tabelle, wo die oid spalte werte mit kleiner 0 haben ? wenn du das nämlich auschließen kannst, kannst du dir auch die oid > 0 bedingung sparen, bzw, wenn nicht kannst du sie mal anstelle in der router tabelle auszuschließen mal in der ref_sp ausschließen. vieles hat einfach mit probieren zu tun.

Ilja