Ankündigung

Einklappen
Keine Ankündigung bisher.

regelmäßiges Update ab und zu langsamer als insert

Einklappen

Neue Werbung 2019

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

  • regelmäßiges Update ab und zu langsamer als insert

    Hallo,
    Ich könnte mal ein paar vorschläge gebrauchen,
    schon mal vorab danke dafür.

    teil 1
    In einer for-schleife werden alle 20 sek
    In eine tabelle mit ca. 10000 datensätzen,
    die am tag immer grösser wird,
    ständig 20 neue datensätze über pdo hinzugefügt,
    was immer schnell geht.

    teil 2
    Danach werden in einer anderen tabelle max 50 datensätze mit pdo geupdatet,
    mit immer der gleichen datenmenge.

    Und hier ist mein problem :
    an anfang des tages braucht das update 2 sek für teil 1 + teil 2
    nach ca. 4 stunden benötigen die updates im teil alleine 2 ca. 2bis 3 sek
    in unterschiedlichen abständen,


    Ich benutze :
    Windows 10 64bit
    cpu 3,6 GHz
    ram 16 GB
    eine schnelle ssd festplatte

    xampp 7.2.12
    php 7.2.12
    PDO Driver for MySQL 5.0.12

    es haben bis zu max. 60 user zugriff auf unterschiedliche andere tabellen

    die update geschwindigkeit ist aber nicht anhänging von der anzahl der aktuellen user

    ja ich weis, eigendlich sollte wahrscheinlich alles unter unix laufen !
    habe ich aber auch schon getestet, das ganze system lief da aber auch nicht schneller.

    danke für eure vorschläge
    und schon mal einen gute und datencrashfreien rutsch nach 2019
    klaus schnabel-koeplin



  • #2
    Leider ist Deine Beschreibung "etwas" unpräzise.
    Bspw.: Läuft Teil 2 auch in der Schleife von Teil 1, einfach hinter dem Insert?

    Die Datenmenge von 10000 plus insert/update ist nicht nennenswert.
    Schleifen sind immer schlecht für Inserts und Updates und allermeist unnötig.

    Kommentar


    • #3
      Zeige mal Code von dem Update, aber komplett und die Struktur der Tabelle die du aktuell halten willst.

      Kommentar


      • #4
        hallo protestix,

        danke für deine antowrt !
        der teil 2 läuft auch in einer schleife nach den insert's
        code am ende

        wobei ich dazu sagen muß, das meine erfahrungen mit php 7 und pdo recht neu sind,
        ich habe "leider" bis vor kurzem noch mit php 5 und MySql gearbeitet
        und stelle jetzt nach und nach den code auf pdo um

        hier die struktur der tabelle :

        PHP-Code:
        [CODE]

        CREATE TABLE `dkb_standort` (
        `
        lfdnrINT(11NOT NULL AUTO_INCREMENT,
        `
        u_adrnrVARCHAR(5NOT NULL COLLATE 'latin1_general_ci',
        `
        u_nrVARCHAR(10NOT NULL COLLATE 'latin1_general_ci',
        `
        u_nameVARCHAR(35NOT NULL COLLATE 'latin1_general_ci',
        `
        fahrzeugVARCHAR(20NOT NULL COLLATE 'latin1_general_ci',
        `
        pbVARCHAR(20NOT NULL COLLATE 'latin1_general_ci',
        `
        plzVARCHAR(5NOT NULL COLLATE 'latin1_general_ci',
        `
        ortVARCHAR(50NOT NULL COLLATE 'latin1_general_ci',
        `
        strasseVARCHAR(150NOT NULL COLLATE 'latin1_general_ci',
        `
        von_gpsCHAR(1NOT NULL DEFAULT 'j' COLLATE 'latin1_general_ci',
        `
        satz_angelegt_datTIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        `
        user_einsatz_bereitCHAR(2NOT NULL DEFAULT 'b' COLLATE 'latin1_general_ci',
        `
        user_teamINT(11NOT NULL DEFAULT '0',
        `
        user_med_teamCHAR(1NOT NULL DEFAULT 'n' COLLATE 'latin1_general_ci',
        `
        user_arbeitsschutzCHAR(1NOT NULL DEFAULT 'n' COLLATE 'latin1_general_ci',
        `
        user_beobachtenINT(11NOT NULL DEFAULT '0',
        `
        von_wann_sind_diese_datenDATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
        `
        wann_wurde_der_ltz_auftrag_erledigtCHAR(5NOT NULL DEFAULT '00:00' COLLATE 'latin1_general_ci',
        `
        auftrag_statusCHAR(3NOT NULL DEFAULT 'xx' COLLATE 'latin1_general_ci',
        `
        auftrag_status_indexINT(11NOT NULL,
        `
        wann_hat_sich_user_das_erstemal_angemeldetDATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
        `
        daten_wurden_ueber_gps_geaendertCHAR(1NOT NULL DEFAULT 'n' COLLATE 'latin1_general_ci',
        `
        gps_coordxVARCHAR(15NOT NULL COLLATE 'latin1_general_ci',
        `
        gps_coordyVARCHAR(15NOT NULL COLLATE 'latin1_general_ci',
        `
        zuladungINT(5NOT NULL,
        `
        ladehoeheINT(5NOT NULL DEFAULT '0',
        `
        ladetiefeINT(5NOT NULL DEFAULT '0',
        `
        ladebreiteINT(5NOT NULL DEFAULT '0',
        `
        kfzkennzeiVARCHAR(20NOT NULL COLLATE 'latin1_general_ci',
        `
        ist_user_neuCHAR(1NOT NULL DEFAULT 'n' COLLATE 'latin1_general_ci',
        `
        u_moechte_nur_fruehtourenCHAR(1NOT NULL DEFAULT 'n' COLLATE 'latin1_general_ci',
        `
        test_fuer_updateDATETIME NOT NULL,
        `
        test_fuer_update2INT(11NOT NULL,
        PRIMARY KEY (`lfdnr`),
        INDEX `u_adrnr` (`u_adrnr`),
        INDEX `pb` (`pb`),
        INDEX `satz_angelegt_dat` (`satz_angelegt_dat`),
        INDEX `plz` (`plz`),
        INDEX `strasse` (`strasse`),
        INDEX `ort` (`ort`),
        INDEX `user_team` (`user_team`),
        INDEX `user_beobachten` (`user_beobachten`),
        INDEX `user_einsatz_bereit` (`user_einsatz_bereit`),
        INDEX `auftrag_status` (`auftrag_status`),
        INDEX `user_med_team` (`user_med_team`),
        INDEX `wann_hat_sich_user_das_erstemal_angemeldet` (`wann_hat_sich_user_das_erstemal_angemeldet`),
        INDEX `daten_wurden_ueber_gps_geaendert` (`daten_wurden_ueber_gps_geaendert`),
        INDEX `von_wann_sind_diese_daten` (`von_wann_sind_diese_daten`),
        INDEX `auftrag_status_index` (`auftrag_status_index`),
        INDEX `gps_coordx` (`gps_coordx`),
        INDEX `gps_coordy` (`gps_coordy`),
        INDEX `user_arbeitsschutz` (`user_arbeitsschutz`),
        INDEX `wann_wurde_der_ltz_auftrag_erledigt` (`wann_wurde_der_ltz_auftrag_erledigt`),
        INDEX `fahrzeug` (`fahrzeug`),
        INDEX `u_moechte_nur_fruehtouren` (`u_moechte_nur_fruehtouren`)
        )
        COLLATE='latin1_general_ci'
        ENGINE=MyISAM
        AUTO_INCREMENT
        =732

        [/CODE

        und hier der code :

        PHP-Code:
        [CODE]

        for ( 
        $z 1$z <= $anzahl_fahrer_mit_gps$z++ )
        {

            echo 
        "<br>".$z." / ".$anzahl_fahrer_mit_gps." - ".$gps_fahrer[$z];

            
        ob_flush();
            
        flush();

            
        $query_dkb_mobil_log="select angemeldet from dkb_mobil_log ".
                
        "where `angemeldet`>='".$akt_datum."' and `wer_unr`='".$gps_fahrer[$z]."' ".
                
        "order by `lfdnr` ASC LIMIT 1";

            
        $stmt_dkb_mobil_log $pdo_dkb->query($query_dkb_mobil_log);
            
        //$stmt_dkb_gps_upos->execute();
            
        $anz_dkb_mobil_log=$stmt_dkb_mobil_log->rowCount();

            echo 
        "<br>".$z." / ".$anzahl_fahrer_mit_gps." - ".$gps_fahrer[$z];

            
        ob_flush();
            
        flush();

            
        $query_dkb_gps_upos="select * from dkb_gps_upos ".
                
        "where fahrer_unr='".$gps_fahrer[$z]."' ".
                
        "order by lfdnr desc limit 1 ";

            
        $stmt_dkb_gps_upos $pdo_dkb->query($query_dkb_gps_upos);
            
        //$stmt_dkb_gps_upos->execute();
            
        $row_dkb_gps_upos $stmt_dkb_gps_upos->fetch();

            
        $auswahl_fahrer_adrnr=$row_dkb_gps_upos['fahrer_adrnr'];
            
        $auswahl_fahrer_pb=$row_dkb_gps_upos['plzb_aus_gps'];
            
        $auswahl_fahrer_plz=$row_dkb_gps_upos['gps_postcode'];
            
        $auswahl_fahrer_ort=$row_dkb_gps_upos['gps_city'];
            
        $auswahl_fahrer_strasse=$row_dkb_gps_upos['gps_street'];
            
        $auswahl_fahrer_ausgelesen=$row_dkb_gps_upos['ausgelesen_datetime'];

            
        $auswahl_gps_coordx=$row_dkb_gps_upos['gps_coordx'];
            
        $auswahl_gps_coordy=$row_dkb_gps_upos['gps_coordy'];

            if (
        $auswahl_fahrer_pb<>"x")
            {
                
        $auswahl_fahrer_pb=STR_PAD($auswahl_fahrer_pb,2,"0 ",STR_PAD_LEFT);
            }
            else
                
        $auswahl_fahrer_pb=$row_dkb_gps_upos['gps_city'];


            
        $query_standort_pb="select * from ".$name_dkb_standort." ".
                
        "where u_adrnr='".$auswahl_fahrer_adrnr."' limit 1";

            
        $stmt_standort_pb $pdo_dkb->query($query_standort_pb);
            
        $stmt_dkb_gps_upos->execute();
            
        $anz_standort_pb=$stmt_standort_pb->rowCount();

            include(
        "kur_mobil_intern_upos1_pruefe_user_status .php");

            if (
        $anz_standort_pb>0)
            {
                echo 
        " - update";

                
        ob_flush();
                
        flush();

                
        $row_standort_pb $stmt_standort_pb->fetch();

                
        $auswahl_standort_pb_lfdnr=$row_standort_pb['lfdnr'];
                
        $auswahl_standort_pb_u_adrnr=$row_standort_pb['u_adrnr'];

                
        $hdt=date("Y-m-d H:i:s");

                
        $sql_standort_pb="UPDATE ".$name_dkb_standort." ".
                    
        " set pb='".$auswahl_fahrer_pb."',".
                    
        " plz='".$auswahl_fahrer_plz."',".
                    
        " ort='".$auswahl_fahrer_ort."',".
                    
        " strasse='".$auswahl_fahrer_strasse."',".
                    
        " von_wann_sind_diese_daten='".$auswahl_fahrer_ausge lesen."',".
                    
        " gps_coordx='".$auswahl_gps_coordx."',".
                    
        " gps_coordy='".$auswahl_gps_coordy."', ".
                    
        " user_beobachten='".$auswahl_beobachten."',".
                    
        " user_team='".$auswahl_team."',".
                    
        " user_med_team='".$auswahl_med_team."',".
                    
        " user_einsatz_bereit='".$auswahl_einsatz_bereit."', ".
                    
        " user_arbeitsschutz='".$auswahl_arbeitsschutz."', ".
                    
        " von_gps='j', ".
                    
        " auftrag_status='".$h_auftrag_status."',".
                    
        " auftrag_status_index='".$h_auftrag_status_index."' , ".
                    
        " daten_wurden_ueber_gps_geaendert='".$s_daten_wurde n_ueber_gps_geaendert."', ".
                    
        " wann_wurde_der_ltz_auftrag_erledigt='".$u_auftrag_ erledigt_dat_uhrzeit."' ,".
                    
        " ladehoehe='".$auswahl_ladehoehe."' ,".
                    
        " ladebreite ='".$auswahl_ladebreite."' ,".
                    
        " ladetiefe='".$auswahl_ladetiefe."' ,".
                    
        " zuladung='".$auswahl_zuladung."' ,".
                    
        " ist_user_neu='".$auswahl_ist_user_neu."', ".
                    
        " test_fuer_update='".$hdt."' ".
                    
        " WHERE u_adrnr ='".$auswahl_standort_pb_u_adrnr."' ";

                
        $stmt $pdo_dkb->prepare($sql_standort_pb);
                
        $stmt->execute();

                
        $h_anzds=$stmt->rowCount();

                echo 
        " - update, anz. datensaetze : ".$h_anzds." - aktualisiert : ".$hdt;
            }

        }

        [/
        CODE

        Kommentar


        • #5
          Bearbeite bitte deinen Beitrag und pack den Code in die entsprechenden Code-Tags [CODE/PHP] [/CODE/PHP] Passende Schalter dafür findes auch hier im Editor (der Schalter mit dem # und der Schalter mit php).

          Desweiteren sind die mysql_* Funktionen veraltet, nutze lieber mysqli_* oder besser PDO. Des Rest schaue ich mir jetzt nicht an, da der Code wegen fehlender Formatierung (nicht genutzte Code/PHP-Tags) schlecht lesbar ist!

          Nachtrag:
          Sehe gerade dass du an manchen Stellen PDO schon nutzt, warum dann nicht gleich durchgängig PDO?

          Kommentar


          • #6
            ich würde ja nicht MyISAM nehmen, sondern z.B. Blackhole-Engine, die ist bei speichern deutlich schneller *duck*
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Da hast du ja eine grosse Baustelle.
              Umstellung auf PDO ist da noch das kleinste Übel.
              Die Datenbank hat ein Fehldesign, du mischt Benutzerdaten mit Standortdaten und Fahrzeugdaten.
              Latin 1 ist veraltet, das musst du auf utf8 umstellen und als engine nimmst du, wenn du bei mysql bleiben willst inno_db.

              Die Echos müssen alle raus, das kommt zum Schluss.
              Lies dich mal in das Thema EVA-Prinzip ein, dann brauchst du auch
              PHP-Code:
              ob_flush();
              flush(); 
              nicht mehr
              Du nutzt PDO falsch, siehe dazu https://php-de.github.io/jumpto/pdo/
              Erst prepare dann bind dann execute.

              Mir ist nicht klar nach welchen Kriterien du aktualisierst, aber in einer Schleife wie du es hast wird es immer langsam bleiben..

              Kommentar


              • #8
                Neben den Anmerkungen würde ich vorschlagen, Du schreibst mal, was Du da fachlich überhaupt erledigen willst.
                Aus dem Code ist es für mich jedenfalls nicht entnehmbar. Anderen geht es vielleicht ähnlich, daher können auch die Reparaturvorschläge nicht optimal sein.

                Kommentar


                • #9
                  hallo protestix,

                  danke für deine hinweise
                  ja, das "problem" ist das die ganze anwendung aus ca. 800 scripten besteht
                  die ich vor ca. 8 jahren programmiert habe und jetzt auf php 7 umstellen muß

                  ich habe den php code etwas strukturiert,

                  kann aber, nach dem ansehen von : https://php-de.github.io/jumpto/pdo/
                  wo meinen reihenfolge falsch ist ? aber vielleicht sehe ich ja schon den wald vor bäumen nicht ?!

                  das mit dem umwandeln in eien inno habe ich schon mal probiert,
                  bin dann aber wieder auf myISAM umgestiegen, weil der import aus der alten datenbank nicht geklappt hat
                  und wenn ich jetzt die tabelle wieder in inno umwandel will
                  bekomme aber die meldung das die tabelle schon existiert,
                  aber weder beim auflisten der tabellen mit phpadmin
                  existiert keine inno tabelle
                  und auch befindet sich im verzeichnis der datenbank
                  keine *.idb datei

                  irgendwo muss es wohl einen alten eintrag dazugeben ?

                  Kommentar


                  • #10
                    MyISAM ist ein stinkendes Überbleibsel aus dem letzten Jahrtausend. Das kennt nur komplette Table-Locks. Das war bereits, als es auf den Markt kam, seit Jahrzehnten technisch obsolet. InnoDB ist etwas besser, etwas weniger schmerzhaft. Daß es nicht schmerzfrei ist, hast ja schon gemerkt. Ich sag nur so Dinge wie innodb_file_per_table und so. Dazu kommen die ganzen Fehler beim Design der Tabelle, die Vermischung von Stamm- und Bewegungsdaten, die Verwendung falscher Datentypen, die offenbar via Zufallsgenerator vergebenen Indexe, die ganze Breitseite von MySQL-Bugs etc.

                    tl;dr

                    viel Spaß noch mit dem ganzen Kruscht von Technologien, die längst überholt sind
                    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                    Kommentar

                    Lädt...
                    X