Leistungsfähigkeit von Servern vergleichen
Kalle_B
- webserver
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
fällt euch an diesem Kommando irgendwas auf, was zu stundenlangen Laufzeiten führen kann?
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
ä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
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
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 anw2SET
,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
Hallo Sven,
Außerdem ist dir noch eine vermeidbare Dopplung unterlaufen:
,tm_anwesenheit AS anw1
,tm_anwesenheit AS anw2SET
,anw1.event_id = 0
,anw2.event_id = 0anw1 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