Mailinglisten-Archive |
Michael Niewiara wrote: > > Hallo, > > wie funktioniert eigentlich das "INSERT DELAYED" ? > In meiner Test-Datenbank habe ich zwei Tabellen, eine mit ueber einer > Million Datensaetzen und einer anderen mit ca. 4000. Die Felder der > beiden Tabellen sind fast identisch. Nun reglemaessig bestimmte Daten > aus der kleinen Tabell (Tabelle2) in die grosse (Tabelle1) eingefuegt > werden. Hierfuer verwende ich folgenden SQL-Syntax: > > INSERT INTO Tabelle1 (Feld1, Feld2, Feld3,...) SELECT > Feld1,Feld2,Feld3,... FROM Tabelle2 WHERE STATUS='X' > > Nun will ich zur Optimierung das "DELAYED" verwenden. > Wenn ich die Dokumentation richtig verstehe fuegt die Datenbank dann > nach einer Zeit mehrere Daten auf einmal in die entsprechende Tabelle > ein. Nun frage ich mich nur wie das in meinem Fall mit dem SELECT > aussieht? Wird das SELECT erst zur Zeit des wirklichen einfuegens > ausgefuehrt oder direkt beim Ausfuehren des ganzen Befehls. Das Problem > ist hier einfach nur das die Daten sich in der Tabelle2 zwischen den > Queries aendern und ich somit die Daten, welche zum Zeitpunkt des > "INSERT DELAYED INTO..."-Query in die Tabelle2 befinden in die Tabelle1 > einfuegen will. > Kann das ueberhaupt so funktionieren? Bringt mir das ueberhaupt > Perfomance-Vorteile? > > mfG Michael Hallo Michael Ganz sicher bin ich nicht, aber ich denke, dass der SELECT sofort ausgefuehrt wird. Dessen Ergebnisse werden gepuffert, bis der INSERT dran ist. Der INSERT DELAYED ist dran, wenn gerade keine SELECTS mehr warten, die dessen Tabelle verwenden. Sollten weitere INSERT DELAYED's auf die gleiche Tabelle ausgefuehrt werden, bevor der vorherige ausgefuehrt wurde, werden deren Daten an den bereits existierenden Puffer angehaengt. Kommt der INSERT dann irgendwann dran, fuegt er alle im Puffer befindlichen Daten auf einmal ein. Das bringt natuerlich besonders viel Geschwindigkeitsgewinn, wenn viele kleine INSERT's durchgefuehrt werden. Da Du einen relativ grossen INSERT benutzt (ich denke Du schiebst alle 4000 Zeilen auf einmal rueber) bringt Dir das höchstens eine Verschiebung des Zeitpunkes, an dem die Tabelle fuer den INSERT blockiert wird (Stichwort LOCK). Tschau Christian
php::bar PHP Wiki - Listenarchive