MySQL: Wie bekomme ich das schneller hin?

chris4712

Erfahrenes Mitglied
#1
Guten Abend!

Wie bekomme ich folgende Abfrage beschleunigt (die Ausführung dieser dauert gute 10 Sekunden):

SQL:
SELECT Name, Vorname FROM Benutzer WHERE ID IN (
   SELECT AutorID FROM Dateien GROUP BY AutorID
  )
  OR Typ= 'Entwickler'
  ORDER BY Name, Vorname
Viele Grüße

Christian
 
#2
Probiers mal mit einem LEFT JOIN
SQL:
SELECT 
	b.name, 
	b.vorname 
FROM 
	benutzer benutzer
	LEFT JOIN dateien d
	ON d.autorid = b.id
WHERE 
  b.yp= 'Entwickler'
  OR NOT d.autorid IS NULL
ORDER BY Name, Vorname
Des weiteren ein Index auf dateien.autorid
 
#6
Die Tabelle dateien sollte sicher einen Index auf autorid haben
SQL:
CREATE INDEX idx_dateien_autor ON dateien (autorid );
 
#8
Hi

mir ist grad nicht klar, ob dir klar ist, was ein Index ist.
Hast du früher schon ein CreateIndex gemacht, oder ist das neu für dich?

Btw., mach den zweiten Teil der Bedingung in deiner Abfrage (Typ= 'Entwickler') vorne hin, und dann or das Andere.
 
#10
Und mit den Indizes werden die Sachen auf die man schnell zugreifen muss definiert
Ja (weil ein Index praktisch Zusatzdaten sind, die beim schnellere Fitlern/Ordnen der Werte helfen)

im Speicher (und nicht auf der Festplatte) gehalten.
Nein. Indexdaten sind schon auch auf der Festplatte.

Das DB-System kann Tabellen- und Indexdaten schon auch im RAM haben, vor allem für Sachen die oft angefragt werden zur Verschnellerung, aber auf das hat man so direkt keinen Einfluss.

Ich dachte eigentlich dass durch die Spalte ID mit der Eigenschaft PRIMARY und AI der Index definiert ist?
Ja, Primary (Keys) haben zumindest in MySQL automatisch einen Index dabei (AutoIncrement ist egal).

Der Index ist aber eben für den PrimaryKey allein, nicht für andere Spalten. Wenn der P.K. "ID" heißt werden Sachen wie "WHERE ID=" und "ORDER BY ID" verschnellert. Ich nehme aber an (und Yaslaw offensichtlich auch), dass AutorId nicht der P.K. von Dateien ist, sondern Dateien auch noch eine DateiID oder einfach ID hat? In dem Fall hilft der P.K.-Index für AutorID einfach überhaupt nicht. Für AutorID brauchts einen Index auf der Spalte AutorID.
 
#11
Jedenfalls, um deinen originalen Code etwas abzuändern:
SQL:
SELECT Name, Vorname FROM Benutzer WHERE 
Typ= 'Entwickler'
OR ID IN (
   SELECT AutorID FROM Dateien GROUP BY AutorID
  )
ORDER BY Name, Vorname
Dazu Zusatz-Indexe zumindest auf Dateien.AutorID und Benutzer.Typ