Hofmann: Mysql Performance

Hallo liebe Forengemeinde,

ich habe einige grundsätzliche Fragen, ich hoffe, es kann mir jemand ein paar nützliche Tips geben.

Ich muss den Inhalt einer Datenbank komplett auslesen, diese gewonnenen Daten auf unterschiedlichste Weise modifizieren und und in eine andere Datenbank, die ähnlich aber anders geartet ist, übertragen.

Nun stellt sich hinslichtlich der Performance folgende Frage:

Ist es besser, die Ursprungsdatenbank erst komplett auszulesen (in einen Array zum Beispiel) und dann schrittweise in die neue Datenbank einfügen oder soll ich auch schrittweise auslesen.

Also ala

Select datensatz1 from alte_datenbank
Insert into neue_datenbank

Select datensatz2 from alte_datenbank
Insert into neue_datenbank

Es handelt sich um mehrere tausend Datensätze und ich befürchte, dass das komplette Einlesen in einen Array nicht funktionieren könnte. Wie würdet Ihr  das machen?

Gruss
Hofmann

  1. Über Performance würde ich mir keine Gedanken machen. So wie sich das anhört ist es ein einmaliger Vorgang. Eher um die Vollständigkeit. Ich würde in den alten Tabellen eine Spalte einbauen, die den Status übertragen/nicht übertragen speichert. Dann kannst du alles mit LIMIT schrittweise übertragen.

    Oder vielleicht kannst du auch bei Serverzugriff alle MySQL-Dateien direkt übertragen.

    1. Über Performance würde ich mir keine Gedanken machen. So wie sich das
      anhört ist es ein einmaliger Vorgang. Eher um die Vollständigkeit.

      Hallo Jimboo,

      das Insert wird ein einmaliger Vorgang sein, danach folgende Updates im 4-Stunden-Rhythmus. D.h. alle 4 Stunden wird die alte Datenbank ausgelesen und per UPDATE in die neue übertragen.

      Da die neue Datenbank von der Struktur her nicht zu vergleichen ist, reicht es nicht aus, die Dateien zu kopieren.

      Wie meinst du das mit der vollständigkeit? Meinst du, es könnten Daten verlorgen gehen?

      gruss

      1. Hi,

        das Insert wird ein einmaliger Vorgang sein, danach folgende Updates im 4-Stunden-Rhythmus. D.h. alle 4 Stunden wird die alte Datenbank ausgelesen und per UPDATE in die neue übertragen.

        Und welche Unterschiede bestehen zwischen der initialen Befüllung und den Updates?

        Da die neue Datenbank von der Struktur her nicht zu vergleichen ist, reicht es nicht aus, die Dateien zu kopieren.

        Vielleicht Tabelle kopieren, neue Spalten hinzufügen, per Update diese neuen Spalten befüllen (wenn aus den vorhandenen Daten möglich), anschliessend überflüssige alte Spalten entfernen ...?

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. "Und welche Unterschiede bestehen zwischen der initialen Befüllung und den Updates?"

          Keiner, ausser dass in der alten Tabelle durchaus auch mal neue Datensätze dazukommen können, die dann wieder per INSERT in die Neue eingefügt werden müssen.

          Wie gesagt ist die 'neue' Datenbank komplett anders strukturiert, kein einziges Feld gleicht dem der 'alten' Datenbank

          1. Hi,

            bitte zitiere so, wie es hier üblich ist - die Zitatzeichen werden beim Antworten vorgegeben, also lasse sie bitte bestehen.

            Und welche Unterschiede bestehen zwischen der initialen Befüllung und den Updates?

            Keiner, ausser dass in der alten Tabelle durchaus auch mal neue Datensätze dazukommen können, die dann wieder per INSERT in die Neue eingefügt werden müssen.

            Also auch wieder Inserts.
            Und was sind jetzt die Updates,, von denen du geredet hast?

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
            1. Also auch wieder Inserts.
              Und was sind jetzt die Updates,, von denen du geredet hast?

              die Inserts betrifft doch nur die neuen Datensätze der alten Datenbank. Die alten Datensätze der alten Datenbank werden modifiziert und per UPDATE in die neue Datenbank übertragen.

              Stell dir das so vor:

              Die alte Datenbank ist ein stetig wachsender und sich verändernder Katalog (A). Die Daten dieses Kataloges werden per Skript ausgelesen, modifiziert und in einen ähnlichen, aber völlig anders strukturierten Katalog (B) übertragen. Damit dieser Katalog (B) nun auch auf dem neusten Stand ist, muss er regelmäßig aktualisiert werden. Alte Datensätze werden per UPDATE auf den neuesten Stand gebracht, neue Datensätze, die noch nicht in (B) vorhanden sind, müssen per INSERT eingefügt werden.

          2. Hallo,

            » "Und welche Unterschiede bestehen zwischen der initialen Befüllung und den Updates?"

            Keiner, ausser dass in der alten Tabelle durchaus auch mal neue Datensätze dazukommen können, die dann wieder per INSERT in die Neue eingefügt werden müssen.

            verstehe ich Dich richtig:
            Änderungen gibt es ausschließlich in der "alten" Datenbank. Alle vier Stunden wird die "alte" Datenbank komplett übertragen.

            Habe ich das richtig verstanden?

            Wenn ja, dann solltest Du den Handbuchabschnitt Speed of INSERT Statements durchackern. Welche Möglichkeit Du schließlich wählst, hängt unter anderem von Deinen Möglichkeiten ab.

            Freundliche Grüße

            Vinzenz

            1. verstehe ich Dich richtig:
              Änderungen gibt es ausschließlich in der "alten" Datenbank. Alle vier »»Stunden wird die "alte" Datenbank komplett übertragen.

              Hallo,

              ja exakt. Nur die alte Datenbank wird verändert.
              Danke für den Link

              1. echo $begrüßung;

                ja exakt. Nur die alte Datenbank wird verändert.

                Und es reicht nicht, Views statt neuer Tabellen zu erstellen?

                echo "$verabschiedung $name";

                1. Hallo

                  Und es reicht nicht, Views statt neuer Tabellen zu erstellen?

                  Die Datenbank mit dazugehörigen Tabellen steht ja schon, geht jetzt ja nur noch um den Inhalt.

                  Viele grüße
                  Hofmann

  2. yo,

    Ich muss den Inhalt einer Datenbank komplett auslesen, diese gewonnenen Daten auf unterschiedlichste Weise modifizieren und und in eine andere Datenbank, die ähnlich aber anders geartet ist, übertragen.

    ich hatte in den letzten sehr viel damit zu tun, daten in ein anderes daten-design zu migrieren, dabei handelte es sich um millionen vond atensätze und die transformationen dabei waren sehr komplex. dabei sammelt man einige erfahrungen.

    zum einen wirst du diese schritte so aufbauen können,d as sie automatisch abläufen nud das genau dokumentieren, was passiert nud in welcehr reihenfolge. schaffe dir hilfen, zum beispiel ausdrücke, wo alle relevanten tabellen drauf stehen, die du dann abhaken kannst, wenn du die scripte dafür erstellt hast. sonst kann man sehr leicht was übersehen. um wieviele tabellen handelt es sich den ?

    ganz wichtig zu klären ist auch, wie die alte und die neue datenbank sich die daten austauschen können, das ist quasi das erste, was du festlegen musst. sprich erzeugst du einen dump, den du dann wieder einspielst oder csv dateien, kannst du direkt von der einen datenbank auf die andere datenbank zugreifen, sind die server örtlich weiter voneinander getrennt oder dich beisamen ?

    Ilja

    1. zum einen wirst du diese schritte so aufbauen können,d as sie automatisch
      abläufen nud das genau dokumentieren, was passiert nud in welcehr
      reihenfolge. schaffe dir hilfen, zum beispiel ausdrücke, wo alle relevanten
      tabellen drauf stehen, die du dann abhaken kannst, wenn du die scripte
      dafür erstellt hast. sonst kann man sehr leicht was übersehen. um wieviele
      tabellen handelt es sich den ?

      Hallo,

      es handelt sich um etwa 40 Tabellen aus der Ursprungsdatenbank, die neue Datenbank hat deutlich weniger. Also noch überschaubar.
      Aber der Tip mit dem Abhaken ist gut, dank dir.

      ganz wichtig zu klären ist auch, wie die alte und die neue datenbank sich die daten austauschen können, das ist quasi das erste, was du festlegen musst. sprich erzeugst du einen dump, den du dann wieder einspielst oder csv dateien, kannst du direkt von der einen datenbank auf die andere datenbank zugreifen, sind die server örtlich weiter voneinander getrennt oder dich beisamen ?

      Ilja

      Liegen weit voneinander entfernt. Aber das wäre ja egal, da die Datenstruktur ja eh komplett verändert werden muss.

      1. yo,

        Liegen weit voneinander entfernt. Aber das wäre ja egal, da die Datenstruktur ja eh komplett verändert werden muss.

        das ist ganz und gar nicht egal, das mit der anderen struktur hat damit nichts zu tun. wichtig ist, wie bekomme ich die daten der alten datenbank auf den neuen server. wie machst du es den zurzeit ?

        Ilja

        1. hallo

          das ist ganz und gar nicht egal, das mit der anderen struktur hat damit »»nichts zu tun. wichtig ist, wie bekomme ich die daten der alten datenbank »»auf den neuen server. wie machst du es den zurzeit ?

          noch gar nicht, das Programm muss erst entwickelt werden.

          1. yo,

            noch gar nicht, das Programm muss erst entwickelt werden.

            ok, ich vermute deine planung sieht so aus, das programm baut eine verbindung zu der einen datenbank auf, ließt ein datensatz aus und will ihn dann mit einer weiteren verbindung in die neue datenbank schreiben, die räumlich weiter voneinander getrennt sind. bei größeren Datenmengen nicht sonderlich optimal. es kommt halt letzlich auch auf die transformationen drauf an, die du machen musst. wenn es nur ein paar datensätze sind, dann geht das sicherlich.

            aber ich würde vorschlagen, du machst einen Dump der alten datenbank, spielst ihn  auf den server der neuen datenbank auf und kannst dann die daten entsprechend behandeln, zum beispiel auch mit sql befehlen. das würde sich jedenfalls für enie Initalisierung anbieten und danach muss man nur noch abgleichen.

            Ilja

            1. yo,

              »» noch gar nicht, das Programm muss erst entwickelt werden.

              ok, ich vermute deine planung sieht so aus, das programm baut eine verbindung zu der einen datenbank auf, ließt ein datensatz aus und will ihn dann mit einer weiteren verbindung in die neue datenbank schreiben, die räumlich weiter voneinander getrennt sind. bei größeren Datenmengen nicht sonderlich optimal. es kommt halt letzlich auch auf die transformationen drauf an, die du machen musst. wenn es nur ein paar datensätze sind, dann geht das sicherlich.

              aber ich würde vorschlagen, du machst einen Dump der alten datenbank, spielst ihn  auf den server der neuen datenbank auf und kannst dann die daten entsprechend behandeln, zum beispiel auch mit sql befehlen. das würde sich jedenfalls für enie Initalisierung anbieten und danach muss man nur noch abgleichen.

              Ilja

              ja richtig, genauso war meine Planung bisher

              es handelt sich um so ca. 30000 datensätze. meinst du, das wird nicht hinhauen? das Programm, welches für den Import, die Transformationen und die Inserts/Updates zuständig ist, läuft übrigens auf der Shell.

              1. »» aber ich würde vorschlagen, du machst einen Dump der alten datenbank, »»spielst ihn  auf den server der neuen datenbank auf und kannst dann die »»daten entsprechend behandeln, zum beispiel auch mit sql befehlen. das würde »»sich jedenfalls für enie Initalisierung anbieten und danach muss man nur »»noch abgleichen.

                Nochmal zu dem Abgleichen. Ich bin bisher davon ausgegangen, dass ich einfach jedes Feld Update, egal ob es gleichgeblieben ist oder nicht. Bessere wäre es wohl, jedes Feld /Wert vorher jeweils zu prüfen oder? Ist halt die Frage, was performanter ist. Ich gebe zu, auf diesem Gebiet bin ich ziemlich Laie.

                1. yo,

                  Nochmal zu dem Abgleichen. Ich bin bisher davon ausgegangen, dass ich einfach jedes Feld Update, egal ob es gleichgeblieben ist oder nicht. Bessere wäre es wohl, jedes Feld /Wert vorher jeweils zu prüfen oder? Ist halt die Frage, was performanter ist. Ich gebe zu, auf diesem Gebiet bin ich ziemlich Laie.

                  performance ist immer relativ und im auge des betrachters. wenn für dich die geschwindigkeit reicht, dann passt es. man sollte nicht anfangen zu tunen, wenn es nichts zu tunen gibt. aber es würde schon sinn machen, einen mechanismus in der quell-datenbank zu haben, der einem sagt, ob nach dem letzten abgleich der datensatz verändert wurde oder nicht. aber was ist den mit datensätze, die gelöscht wurden ?

                  Ilja

                  1. letzten abgleich der datensatz verändert wurde oder nicht. aber was ist den »» mit datensätze, die gelöscht wurden ?

                    Du hast recht, das hatte ich noch nicht bedacht. Leider habe ich auf die Struktur der Quelldatenbank keinen Einfluss, ich kann daran leider nichts ändern oder ein Feld einfügen etc.

                    1. yo,

                      Du hast recht, das hatte ich noch nicht bedacht. Leider habe ich auf die Struktur der Quelldatenbank keinen Einfluss, ich kann daran leider nichts ändern oder ein Feld einfügen etc.

                      wenn du nichts ändern kannst, dann müsstest du ja rein theoretisch immer die komplette datenbank neu aufsetzen oder wie willst du den abgleich lösen ?

                      Ilja

                      1. wenn du nichts ändern kannst, dann müsstest du ja rein theoretisch immer die komplette datenbank neu aufsetzen oder wie willst du den abgleich lösen ?

                        So schauts leider aus... die alte Datenbank ist äußerst aktiv und unterliegt einer stetigen Änderung. Das ist jetzt natürlich eine aufwändige Sache....

                        1. yo,

                          So schauts leider aus... die alte Datenbank ist äußerst aktiv und unterliegt einer stetigen Änderung. Das ist jetzt natürlich eine aufwändige Sache....

                          ich komme leider aus der oracle-welt, dort hat man recht vielseitige möglichkeiten, daten zu übrtragen, sqlloader, dumps mit import/export oder auch transportable tablespaces. in mysql kenne ich mich da mit den möglichkeiten nicht wirklich aus. aber mein tipp an dich wäre, erzeuge einen dump der quell-datenbank, transportiere den dump zur zieldatenbank, lese ihn dort ein, so dass du ein genaues abbild der datenbank hast und erzeuge dann die transformation in eine zweie datenbank auf dem gleichen server. hat den vorteil, dass du auch sql einsetzen kannst, um die daten-transformation durchzuführen.

                          Ilja