Wenige, komplexe ODER viele, einfache MySQL-Querys?



  • Hi,

    hoffe, der Titel was aussagekräftig gewählt.
    Ich arbeite gerade an meiner Homepage (wie seit 2 Jahren) und bin jetzt auch mit der Optimierung beschäftigt. Ich überlege, wie ich einen guten Seitenaufbau und eine möglichst geringe Belastung für den Server hinbekommen kann und da habe ich meine Sql-Klasse halt ma so bearbeitet, dass die mir die Anzahl der DB(MySQL)-Querys ausgibt.
    (1) Ich habe jetzt 16-50 Zugriffe, je nachdem, wobei man mit ein paar Tricks wie tief verschachtelten LEFT-JOIN-Abfragen o.ä. sicherlich viele davon wegkriegen könnte.
    Die Frage ist: Bringt's das?

    (2) Was ich mich außerdem frage, ist, ob es etwas bringt, ein paar Benutzerdaten, die sich nicht unbedingt von Seite zu Seite ändern, in Sessions auszulagern, anstatt diese jedes Mal aufs Neue von der DB abzufragen. Zum Beispiel könnte man ein paar Designdaten beim ersten Login speichern und dann jedes weitere Mal statt aus der MySQL-DB aus den Sessions auslesen, aber macht das performance- und belastungstechnisch heutzutage überhaupt noch etwas aus?

    (3) Und die Frage ist auch, ob solche Dinge überhaupt wichtig sind bei Besuchern < 100 gleichzeitig? Hat hier jemand evtl. Ahnung, ab welchen Zahlen (geschätzt) so etwas überhaupt merkbar und markant ins Gewicht fallen würde?

    Bin um jede Antwort froh, nur ein wenig Klarheit in diesem Nebel der Optimierung wäre mir schon ein Steinfall vom Herzen,

    mfG Eisflamme 🙂



  • 1. Verschachtelte Anweisungen sind nicht gut, da sie die DB-Logik nicht gut optimierne kann.

    2. Solltest du machen, wenn du es speicherst und es keine kritischen Daten sind.

    3. Wenn es reine Lese-Anfragen sind sollte das Problem von Speeren ja nicht auftretten. Aber jede Anfrage kostet Rechenleistung und Zugriffszeit auf die Festplatte. Wie sehr das ins Gewicht fällt hängt von deinem System ab. Was gut ist, wenn es viel Ram gibt, weil dann die Wartezeiten verkürzt werden.



  • Beachte nur bei aller Optimierung immer, dass der SQL-Server wesentlich mehr auf Optimierung optimiert ist, als deine Skripte!



  • Hi,

    imhotep:
    Ja, danke. 🙂

    Also zu (3) kann ich nur sagen, dass es nicht mein eigener Server ist, sondern ein Onlineserver...
    Nagut, ich werd's ja auf Dauer sehen.

    Reyx:
    Hm, ja, das ist ja eben das Ding. Ich hab jetzt eine Navigation und die wird auch aus der DB ausgelesen, der liest halt alle Kategorien aus und davon dann die Subkategorien, das macht ein paar Abfragen...
    Und solche Abfragen sind natürlich an der Zahl viel, aber andererseits ist es ja nichts Besonderes, keine Ahnung...

    hier Mal so ein Beispiel:

    SELECT href,topic FROM navigation WHERE parentid = 26 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 27 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 61 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 56 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 65 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 66 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 37 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 73 ORDER BY sort
    

    Das sind immerhin ganze 8 Abfragen, sind aber sehr simpel. Mit ein wenig LEFT Und ein wenig JOIN oder sonst was könnte ich das sicher hinkriegen, dass das nur ein Aufruf wird... Aber genau da frag ich halt, macht das Sinn? 🙂

    Danke schon Mal :),

    MfG Eisflamme



  • Schau Dir evtl. mal Nested-Sets an. Ist wahrscheinlich für eine Navi ein wenig overhead, aber damit bekommst Du die Navi als Baum mit einer einzigen Abfrage.

    Den Thread dazu findest Du hier.

    Ansonsten würde ich einfach mal die Ausführungszeit von den "vielen" SQLs messen, umbauen und dann von den "komplexen" SQLs messen und vergleichen. Wenn Du die Möglichkeit hast, dann schau Dir die Auslastung des Servers dabei an.



  • Hi,

    ok, der Thread scheint etwas übertrieben, aber im letzten Fall hast du Recht, die Ausführungszeit zu betrachten wäre wohl die richtige Variante.
    Na ja, ich werd' mal schauen, vielen Dank. 🙂

    MfG Eisflamme



  • Es macht durchaus sinn bestimmte dinge in der session auszulagern da session nur eine datei ist.
    diese wird sowieso geöffnet wenn du sie in jeder seite auch so brauchst.
    datenbank ist ja auch eine datei die aber größer sein kann.
    bei session wird kein Socket oder sonstige namedpipes verwendet um daten zu transportieren.

    es kann aber auch sein das datenbank schneller als sessions ist weil die datenbank die daten im speicher hält.
    müsstest du mal testen.
    viele selects können langsamer sein wenn du jedesmal eine neue verbindung zum DBMS startest.



  • Dafür brauchst du kein Left oder Join das steht ja alles in der selben Tabelle

    SELECT href,topic FROM navigation WHERE parentid = 26 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 27 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 61 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 56 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 65 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 66 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 37 ORDER BY sort
    SELECT href,topic FROM navigation WHERE parentid = 73 ORDER BY sort
    
    SELECT href,topic FROM navigation WHERE parentid in (26,27,61,56,65,66,37,73) ORDER BY sort
    


  • hm, und was ist, wenn die Tabelle so aussieht?

    +----+----------+-------+------+
    | id | parentid | topic | sort |
    +----+----------+-------+------+
    | 26 |        0 | A     |    0 |
    | 27 |        0 | B     |    1 |
    | 28 |       26 | C     |    0 |
    | 29 |       26 | D     |    1 |
    | 30 |       27 | E     |    0 |
    | 31 |       27 | F     |    1 |
    +----+----------+-------+------+
    

    Folgender Baum bzw. Bäume wird abgebildet:

    A
    |- C
    `- D
    B
    |- E
    `- F
    

    Wenn ich jetzt Deine Abfrage nehme, dann erhalte ich folgende Liste:

    SELECT href,topic FROM navigation WHERE parentid in (26,27) ORDER BY sort
    
    +----+----------+-------+------+
    | id | parentid | topic | sort |
    +----+----------+-------+------+
    | 28 |       26 | C     |    0 |
    | 30 |       27 | E     |    0 |
    | 29 |       26 | D     |    1 |
    | 31 |       27 | F     |    1 |
    +----+----------+-------+------+
    

    also im Sinne der Baumstruktur unsortiert ...



  • Da brauch er immer noch kein Join

    SELECT href,topic FROM navigation WHERE parentid in (26,27,61,56,65,66,37,73) ORDER BY parentid,sort
    


  • Das ist schlecht, ich will ja nicht anhand der parentid sortieren, sondern anhand des Wertes in der sort-Spalte. Wenn ich jetzt folgende Tabelle hätte:

    +----+----------+-------+------+
    | id | parentid | topic | sort |
    +----+----------+-------+------+
    |  1 |        0 | A     |    1 |
    |  2 |        0 | B     |    0 |
    |  3 |        0 | C     |    2 |
    |  4 |        1 | D     |    0 |
    |  5 |        1 | E     |    1 |
    |  6 |        2 | F     |    0 |
    |  7 |        2 | G     |    1 |
    +----+----------+-------+------+
    

    Dann will ich die Ausgabe:

    +----+----------+-------+------+
    | id | parentid | topic | sort |
    +----+----------+-------+------+
    |  2 |        0 | B     |    0 |
    |  6 |        2 | F     |    0 |
    |  7 |        2 | G     |    1 |
    |  1 |        0 | A     |    1 |
    |  4 |        1 | D     |    0 |
    |  5 |        1 | E     |    1 |
    |  3 |        0 | C     |    2 |
    +----+----------+-------+------+
    

    Da ich die Wurzel-Knoten A, B und C ja ebenfalls nach sort sortiert haben möchte. Wenn ich jetzt nur eine Ebene habe, dann brauche ich einen join, bei 2 Ebenen schon 2, usw.
    (soweit ich mir das vorstelle, habe noch nie versucht so eine Sturktur mit einem Select abzuholen, ausg. Nested-Sets)

    Oder irre ich mich da jetzt komplett?

    Wenn ich nach parentid, sort sortiere, dann erhalte ich die Liste:

    +----+----------+-------+------+
    | id | parentid | topic | sort |
    +----+----------+-------+------+
    |  2 |        0 | B     |    0 |
    |  1 |        0 | A     |    1 |
    |  3 |        0 | C     |    2 |
    |  4 |        1 | D     |    0 |
    |  5 |        1 | E     |    1 |
    |  6 |        2 | F     |    0 |
    |  7 |        2 | G     |    1 |
    +----+----------+-------+------+
    

Log in to reply