Uli: Prozess blockiert Mysql

Hallo,
ich habe folgende Query auf einer MySQL Maschine ausgeführt:
Insert into tabelleA select * from tabelleB;

In der Zeit wo dieser Befehl ausgeführt wird sperrt (Lockt) MySQL aber alle anderen Select Befehle auf die tabelleB. Dies war schon soweit dass MySQL die max_connections erreicht hat und dann praktisch die PHP Anwendung nicht mehr lief.
Hat jemand eine Idee warum MySQL die Tabelle lockt und wie man das umgehen könnte. Der Insert into Befehl braucht leider seine Zeit ... da kann ich wahrscheinlich nicht viel machen.
Grüße
Uli

  1. Hi Uli

    Insert into tabelleA select * from tabelleB;

    In der Zeit wo dieser Befehl ausgeführt wird sperrt (Lockt) MySQL aber alle anderen Select Befehle auf die tabelleB.

    Das wundert mich. Ich haette jetzt gedacht, daß alle Kommandos auf tabelleA bis zum commit zurückgehalten werden.

    Aber wenn mySQL dieses Verhalten macht, vielleicht gibt es bei mySQL eine Art Trigger. Du kannst dann jeden Eintrag von tabelleB per Trigger nach tabelleA kopieren und brauchst dann den insert nicht. Wie wäre das ?

    Gruß

    Hans

    1. echo $begrüßung;

      Das wundert mich. Ich haette jetzt gedacht, daß alle Kommandos auf tabelleA bis zum commit zurückgehalten werden.

      Es wäre sehr nett, wenn du bitte mal aufhörtest, mit deinem Wissen über andere DBMS auf MySQL zu schließen und dann die anderweitig erlangten Kenntnisse als Selbstverständlichkeit bei MySQL zu verkaufen. Das stiftet nur mehr Verwirrung als dass es hilft.

      Transactions und damit ein "commit" gibt es in MySQL nur, wenn Tabellentypen wie InnoDB oder DBD verwendet werden. Standardmäßig wird jedoch der Typ MyISAM verwendet. Hat man einen Grund, einen anderen Tabellentyp zu wählen, z.B. weil man Transaktionen benötigt, dann gehört man im Allgemeinen zu den Fortgeschrittenen und sollte wissen, dass mit dem anderen Tabellentyp eine andere Storage-Engine verwendet wird, dass diese aus diversen Gründen (z.B. weil die Engine von einem anderen Hersteller entwickelt wurde und im Laufe der MySQL-Geschichte hinzugekauft wurde) ein deutlich anderes Verhalten an den Tag legt und andere Features zur Verfügung stellt, und dass dies von so wesentlicher Bedeutung ist, dass man das mit dazu sagen muss, wenn man ein Problem damit hat.

      Aber wenn mySQL dieses Verhalten macht, vielleicht gibt es bei mySQL eine Art Trigger. Du kannst dann jeden Eintrag von tabelleB per Trigger nach tabelleA kopieren und brauchst dann den insert nicht. Wie wäre das ?

      Siehe oben, erster Abschnitt. Trigger stehen erst ab Version 5.0 zur Verfügung. Version 5.0 wurde erst im Oktober 2005 als "Production Release" gekennzeichnet. Die Wahrscheinlichkeit, dass diese Version beim OP zum Einsatz kommt, schätze ich zum jetzigen Zeitpunkt noch nicht sehr hoch ein.

      Sowohl als Fragender als auch als Antwortender ist es immer nützlich, die konkrete Version anzugeben, auf die man sich bezieht.

      Zum Locking-Problem kann ich nichts sagen, da ich damit keine Erfahrung habe.
      Ein anderer Tipp wäre jedoch, während des Inserts auf Indizes in tabelleA zu verzichten. Dann muss nicht jeder Datensatz einzeln in den Index eingearbeitet werden. Inwieweit dies einen Geschwindigkeitsvorteil bietet hängt sicherlich von der Tabellengröße und der Art und Anzahl der Indizes ab und sollte mit einer praxisnahen Messreihe getestet werden.

      echo "$verabschiedung $name";