Hallo Stefan,
ich habe Deine Abfrage mit expliziter Join-Syntax umgeschrieben. Performance sollte das nicht bringen (das war mal), ich finde sie nur wesentlich lesbarer.
SELECT DISTINCT
r.router_name AS hostname,
s.vpn_id AS vpn_id,
s.sp_no AS sp_no,
s.oid_r AS roid,
s.oid AS soid
FROM
ref_sp AS s
INNER JOIN
router AS r
ON
r.oid = s.oid_r
WHERE
r.oid > 0;
Wenn ich Google richtig verstehe, werden die indizierten Spalten schon bei der Indexierung so aufbereitet, dass die Suchanfragen schneller abgearbeitet werden. Wenn ein neuer Datensatz hinzugefügt wird, wird der Index automatisch angepasst. Ich kann nahezu beliebig viele Spalten indizieren. Ich habe durch die Indizierung außer dem erhöhten Speicherbedarf keine Nachteile.
Ist das soweit korrekt?
nein, das ist nicht soweit korrekt. INSERT- und UPDATE-Operationen werden aufwendiger, weil der Index angepasst werden muss.
Bei großen Datenimports kann es günstiger sein, zuerst Indexe zu löschen, den Datenimport durchzuführen und danach die Indexe wieder neu anzulegen.
Zu Deinem Problem solltest Du das Optimierungskapitel des MySQL-Handbuchs durcharbeiten, insbesondere den Abschnitt zum Vermeiden von Full-Table-Scans.
Ich hab' überhaupt keine Vorstellung, welche Daten in Deinen Spalten enthalten sind, keine Vorstellung, wie oft diese in Deinen (inzwischen) indizierten Spalten vorkommen können, da Du diese wichtigen Informationen einfach verschweigst. DB-Tuning, Abfragen-Tuning ist oft genug von den vorhandenen Daten abhängig, wie Du im von mir verlinkten Kapitel nachlesen kannst.
Ein paar Beispieldatensätze der Ausgangstabellen sowie das gewünschte Ergebnis mit einer Nicht-SQL-Beschreibung sind im Normalfall hilfreicher als vollständige CREATE-Statements ohne jeglichen Kommentar.
Freundliche Grüße
Vinzenz