Kalle_B: Leistungsfähigkeit von Servern vergleichen

Hallöle,

gibt es eine Maßeinheit für die Leistungsfähigkeit von Webservern?

Meiner kommt mir jämmerlich schwach vor. Zeige auf jeder Seite die Sekunden an vom Programmstart bis zum Ende. Das können bei der gleichen Aktion mal 1,5 und auch 27 sec sein, PHP und MySQL- Zugriffe.

Ich betone, dass die Leistungs- Kosten- Relation dennoch in Ordnung geht, aber jetzt muss schluss sein mit der Bastelei.

Mein Kunde verlangt einen leistungsfähigeren Rechner, aber wie kann ich solche Angebote finden und nachprüfen?

Hänge gerade wieder vor dem blockierten Server, offenbar zwingt ihn eine SQL- Kommando mit ca. 1.500 Updates für Stunden in die Knie.

Gestern war das auch der Anlass, Feierabend zu machen. Morgens war wieder alles klar und ich habe das "nackte Kommando" testweise in PHPmyAdmin eingegeben. War nach 10 sec erledigt. Also vollkommen falsch kann das nicht sein.

Was zum Teufel ist denn jetzt um 1:25 auf dem Terions- Rechner los?

Kalle

  1. fällt euch an diesem Kommando irgendwas auf, was zu stundenlangen Laufzeiten führen kann?

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    EVENTBUCHUNG STORNIEREN, AUCH IN TABELLE ANWESENHEIT _eventbuchungen.php

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    UPDATE
     tm_eventbuchungen AS evb1
    ,tm_anwesenheit    AS anw1
    ,tm_anwesenheit    AS anw2

    SET
     evb1.gebuchte_event_id = 0
    ,evb1.gruppen_id        = 0
    ,evb1.von_slot_nr       = 0
    ,evb1.bis_slot_nr       = 0
    ,anw1.event_id          = 0
    ,anw2.event_id          = 0

    WHERE  gebuchte_event_id=83 OR gebuchte_event_id=103 OR gebuchte_event_id=104
    AND    anw1.adr_id          = evb1.adress_id
    AND    anw1.slot_nr         = evb1.von_slot_nr
    AND    anw2.adr_id          = evb1.adress_id
    AND    anw2.slot_nr         = evb1.bis_slot_nr

    Kalle

    1. ändert sich die Logik, wenn ich die ORs klammere?

      WHERE  (gebuchte_event_id=83 OR gebuchte_event_id=103 OR gebuchte_event_id=104)

      AND    anw1.adr_id          = evb1.adress_id
      AND    anw1.slot_nr         = evb1.von_slot_nr
      AND    anw2.adr_id          = evb1.adress_id
      AND    anw2.slot_nr         = evb1.bis_slot_nr

      Kalle

      1. Moin!

        ändert sich die Logik, wenn ich die ORs klammere?

        Hängt davon ab, welche Logik du wünschst.

        WHERE  (gebuchte_event_id=83 OR gebuchte_event_id=103 OR gebuchte_event_id=104)

        AND    anw1.adr_id          = evb1.adress_id
        AND    anw1.slot_nr         = evb1.von_slot_nr
        AND    anw2.adr_id          = evb1.adress_id
        AND    anw2.slot_nr         = evb1.bis_slot_nr

        Dasselbe ist es nicht. Ohne Klammern bindet AND stärker, als OR (und das Gleichheitszeichen bindet stärker, als das AND), also hättest du ohne Klammern etwas, was alles aktualisiert, was ID=83 oder ID=103 oder (ID=104 plus AND-Bedingungen) trifft.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
    2. Moin!

      fällt euch an diesem Kommando irgendwas auf, was zu stundenlangen Laufzeiten führen kann?

      Im Grundsatz: Ja!

      Das Multi-Tabellen-Update deutet drauf hin, dass effektive Indizierung notwendig ist, um die Laufzeit des Kommandos im Rahmen zu halten. Und da du hier die Tabelle eventbuchungen zweimal mit der Tabelle anwesenheit verknüpfst, verdoppeln sich deine Probleme, wenn kein Index genutzt werden kann.

      Wenn MySQL das doppelte Kreuzprodukt bilden muß, um daraus die gewünschten Datensätze zu filtern und dann zu aktualisieren, dann dauert das heftig lange. Natürlich nicht in deiner Testdatenbank mit 10 Einträgen, aber in der Livedatenbank mit zehntausend Einträgen.

      Außerdem ist dir noch eine vermeidbare Dopplung unterlaufen:

      ,tm_anwesenheit    AS anw1
      ,tm_anwesenheit    AS anw2

      SET
      ,anw1.event_id          = 0
      ,anw2.event_id          = 0

      anw1 und anw2 sind die identische Tabelle, also ist auch anw1.event_id identisch mit anw2.event_id. Es reicht hier, die 0 _einmal_ zu setzen.

      Das ist aber nicht das Problem der langen Laufzeit.

      Verwende EXPLAIN (ggf. erstmal nur mit SELECT), um rauszufinden, welche Indizes hier wirken würden. Optimiere den Index.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. Hallo Sven,

        Außerdem ist dir noch eine vermeidbare Dopplung unterlaufen:

        ,tm_anwesenheit    AS anw1
        ,tm_anwesenheit    AS anw2

        SET
        ,anw1.event_id          = 0
        ,anw2.event_id          = 0

        anw1 und anw2 sind die identische Tabelle, also ist auch anw1.event_id identisch mit anw2.event_id. Es reicht hier, die 0 _einmal_ zu setzen.

        Nein, das stimmt so nicht. Der Witz ist ja gerade, dass sich Kalle 2 Aliase auf die gleiche Tabelle definiert, um die Tabelle mit *unterschiedlichen* Datensätzen der tm_eventbuchungen-Tabelle verknüpfen zu können, d.h. in tm_eventbuchungen gibt's 2x einen Foreign Key, der auf die tm_anwesenheit-Tabelle zeigt - d.h. ein Datensatz aus der Tabelle tm_eventbuchungen wird hier in der Abfrage mit *zwei unterschiedlichen* Datensätzen aus der tm_anwesenheit-Tabelle verknüpft - wenn er nun ein SET event_id = 0 weglässt, dann wird nur bei einem dieser Datensätze die event_id geändert (außer die Datensätze wären _zufälligerweise_ der gleiche) - was dann nicht das gewünschte Ergebnis ist.

        Viele Grüße,
        Christian