Ankündigung

Einklappen
Keine Ankündigung bisher.

delete duplicate scriptlaufzeit

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • delete duplicate scriptlaufzeit

    Hallo,

    ich mal wieder Also...csv import klappt, updates auch. Nun muss ich etwas an der performance schrauben, da ich eine Scriptlaufzeit von 90s, CPU Nutzung 30s und RAM 100MB habe. Ich werde in Schritten über CronJobs arbeiten. Später ggf. eigenen Server.

    Bei 100 Datensätzen klappt der load data import und das lösche der Duplikate.

    Bei 5000 Datensätzen klappt der load data import, aber beim löschen der Duplikate hängt sich das Script weg.

    Code:
    DELETE t1 FROM tmp t1, tmp t2
    WHERE t1.Unique = t2.Unique AND
    t1.id < t2.id AND
    t1.csv_upload_id = 1
    Query Zeit: 02:30min
    Zeilen: 3076311

    Nun die Anfänger-Frage:

    1. Ist dieser Befehl zum löschen von Duplikaten wirklich so aufwendig für den Server bzw. sind solche Zeiten normal? (scheint ja der Fall zu sein). Jeder Datensatz wird hier ja auf 4999 andere geprüft. Richtig?

    2. Gibt es eine Möglichkeit das ganze schneller durchzuführen? Index besteht bereits! Ggf. kann man beim verschieben von tmp->live ON DUPLICATE KEY nutzen und somit die Duplikate im tmp table belassen. Oder läuft das auf das gleiche Ergebnis hinaus?

    Zu meinen Fragen habe ich auch schon die Technik meines Hosters kontaktiert. Die konnten mir hier aber auch nicht weiter helfen.

  • #2
    Wenn du bereits einen Unique-Identifier hast kannst du den Import bereits duplizierende Zeilen ignorieren lassen.
    LOAD DATA INFILE '/path/to/file' IGNORE INTO ...

    Kommentar


    • #3
      Nun, der Unique setzt sich erst im tmp table zusammen...ich müßte beim Import also auf 2 Spalten den Unique prüfen lassen. Muss mal suchen, ob und wie das funktioniert.

      Beispiel:
      csv->
      (Haus1,Auto1)
      (Haus1,Auto2)
      (Haus1,Auto1)

      Unique Feld im tmp table->
      Haus1|Auto1
      Haus1|Auto2
      Haus1|Auto1 (Duplikat, also löschen bzw. IGNORE beim import)

      Werde deinen Vorschlag auf jeden Fall testen. Denkst Du ich erhalte hier eine bessere Performance?

      PS: Ach ja...in MySQL kann ich ja mehrer Spalten als ein Unique zusammenführen...mal schauen ob das beim Import Probleme bezüglich Performance bereitet...

      Kommentar


      • #4
        Also, das Thema hatte ich ja schon einmal...die Lösung

        1. Limit für Datensätze der CSV
        Code:
        // CSV LINE LIMIT
        $CSVLineLimit = 30000;
        // LOOP CSV AND GET NUMBER OF LINES
        $CSVLineCount = count(file($csv_path));
        if($CSVLineCount > $CSVLineLimit + 1 OR $CSVLineCount = 0){
        //Nothing
        }
        else{
        //Import
        }
        2. Der Import erfolgt in TableTMP

        3. Insert Ignore von TableTMP->TableLIVE

        Dabei fasse ich im TableLIVE 2 oder mehr Spalten als Unique zusammen. Nun werden keine Duplikate verschoben. Das ganze habe ich bis 10.000+10.000Duplikate = 20.000 Datensätze versucht und...naja...lief alles recht schnell. CSV hatte ca. 2,3MB. Scriptlaufzeit, CPU Zeit und RAM bleiben in ihren Limits. Es gibt also keinen Abbruch! Genau die Lösung, nach der ich die ganze Zeit gesucht habe. MySQL scheint damit einfach schneller zu arbeiten.

        Edit: Ja...INNER JOINS scheinen wirklich intensiv zu sein. Solche Auswertungen werde ich also über einen CronJob anstoßen. Import von 10.000 Datensätzen mit Updates klappen sehr schnell! Auch INSERT IGNORE (bei Uniques) ist schnell, wenn von einem tmp->live table gearbeitet wird. So werden die Duplikate gefiltert.

        Kommentar

        Lädt...
        X