1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

MySQL: Wie bekomme ich das schneller hin?

Dieses Thema im Forum "Relationale Datenbanksysteme" wurde erstellt von chris4712, 15. November 2016.

  1. chris4712

    chris4712 Erfahrenes Mitglied

    Guten Abend!

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

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

    Christian
     
  2. Yaslaw

    Yaslaw n/a Moderator

    Probiers mal mit einem LEFT JOIN
    Code (SQL):
    1. SELECT
    2.     b.name,
    3.     b.vorname
    4. FROM
    5.     benutzer benutzer
    6.     LEFT JOIN dateien d
    7.     ON d.autorid = b.id
    8. WHERE
    9.   b.yp= 'Entwickler'
    10.   OR NOT d.autorid IS NULL
    11. ORDER BY Name, Vorname
    Des weiteren ein Index auf dateien.autorid
     
  3. chris4712

    chris4712 Erfahrenes Mitglied

    Hey!

    Geht zwar, braucht aber auch ca. 10 Sekunden in der Ausführung.
    Die Dateien DB hat über 10.000 Einträge ;)
     
  4. Yaslaw

    Yaslaw n/a Moderator

    Was für Index hast du auf den Tabellen?
     
  5. chris4712

    chris4712 Erfahrenes Mitglied

    Ich hoffe ich habe die Frage richtig verstanden:
    Beide Tabellen haben eine ID Spalte mit einem Primärschlüssel / AUTO_INCREMENT
     
  6. Yaslaw

    Yaslaw n/a Moderator

    Die Tabelle dateien sollte sicher einen Index auf autorid haben
    Code (SQL):
    1. CREATE INDEX idx_dateien_autor ON dateien (autorid );
     
  7. chris4712

    chris4712 Erfahrenes Mitglied

    Hat sie durch die Spalte "AutorID". Oder muss ich diese Werte direkt mit dem Index der Tabelle Autoren verknüpfen?

    Den MySQL Befehl habe ich eben auf die Tabelle Dateien losgelassen. Geändert hat sich nix?! :(

    Sorry, stehe grade ein wenig auf dem Schlauch :(
     
  8. sheel

    sheel I love Asm Administrator

    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.
     
  9. chris4712

    chris4712 Erfahrenes Mitglied

    Ich dachte eigentlich dass durch die Spalte ID mit der Eigenschaft PRIMARY und AI der Index definiert ist?
    Und mit den Indizes werden die Sachen auf die man schnell zugreifen muss definiert und im Speicher (und nicht auf der Festplatte) gehalten. Oder ist das falsch?
     
  10. sheel

    sheel I love Asm Administrator

    Ja (weil ein Index praktisch Zusatzdaten sind, die beim schnellere Fitlern/Ordnen der Werte helfen)

    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.

    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. sheel

    sheel I love Asm Administrator

    Jedenfalls, um deinen originalen Code etwas abzuändern:
    Code (SQL):
    1. SELECT Name, Vorname FROM Benutzer WHERE
    2. Typ= 'Entwickler'
    3. OR ID IN (
    4.    SELECT AutorID FROM Dateien GROUP BY AutorID
    5.   )
    6. ORDER BY Name, Vorname
    Dazu Zusatz-Indexe zumindest auf Dateien.AutorID und Benutzer.Typ
     
Die Seite wird geladen...