preformance Problem

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

  • #46
    ja, aua - aber geht

    OffTopic:
    Wie würdest du die last-activity eines Users speichern?
    Weil, anhand dieses wertes wird bei jedem Select nach User-Daten (das sind viele, weil social networking plattform) entschieden, ob der user noch online ist, oder nicht...

    Kommentar


    • #47
      OffTopic:
      Original geschrieben von prego
      Wie würdest du die last-activity eines Users speichern?
      Weil, anhand dieses wertes wird bei jedem Select nach User-Daten (das sind viele, weil social networking plattform) entschieden, ob der user noch online ist, oder nicht...
      Also wir hatten es mal so gelöst, dass in der Session ein timestamp war und sobald der älter als X Minuten war, wurde der Timestamp in der DB upgedated

      Mittlerweile (wie ich gerade feststellen durfte -_-) wird diese Spalte wohl nur beim Login upgedated, die eigentliche Funktionalität bezüglich welcher User online ist, wird über das FS direkt auf dem Webserver gelöst (Kombination aus touch und filemtime) ... was ich davon halte, behalte ich jetzt mal für mich -.-

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #48
        OffTopic:
        Danke, das ist sehr interessant.
        Wenn ich es aber richtig deute sind wohl beide Wege im Zuge der Funktionalität und des Pragmatismus entstanden

        Kommentar


        • #49
          Den Ansatz mit der vergangenen Zeit halte ich (in PHP) aber durchaus für den richtigen.

          Oft genug sind Besucher deutlich unter 10 sek auf einer Seite. (überlegt mal, wie lange ihr für nen Post im Forum braucht)
          Dann kommt es nur noch darauf an, wie man online/offline definiert. bei 5 Minuten z.B. kann man schon einige Requests sparen.

          Kommentar


          • #50
            Hi,

            Kurzer Statusbericht was sich gestern Abend noch alles verbessert hat.
            Also ich habe soweit es mir hier geraten wurde, die Werte richtig übernommen.
            Leider mußte ich diesen Index über die 3 Spalten wieder setzen, weil mir auch wieder eingefallen ist, dass ich den ja bei den Imports benötige, da sonst die Importe länger dauern als die veranschlagten 9 Minuten.
            Alle 10 Minuten läuft der Cron der einen frischen Import anstößt.
            Da mir da gestern 2 Importe länger als 10 Minuten gedauert hatten, hatte ich auf einmal 3 Importe paralell am laufen.
            Naja viel sag ich jetzt nicht dazu - ich war nur froh dass es bereits 2h in der Früh war, wo eh sehr wenig los ist.

            Aber seit ich diesen Index wieder drinnen habe, geht es sich schön aus und die Datenbank verbratet wesentlich weniger an CPU Last.
            Heute bestelle ich ja unseren 2. Server der dann Sklave ist und nur robotten darf mit den Importen, somit fällt mir die Last die das Script welches die Importe verarbeitet auch wieder weg.
            Da kommt dann wirklich nur noch die Last, wenn ich das SQL-File in die DB einspiele.

            Und dazu gäbe es gleich noch eine Frage von mir bzg. des Befehls "LOAD DATA INFILE"
            Ich hab das erst ein einziges mal in meinen Leben genutzt.
            Wäre diese Variante nicht die Beste für mich als hier mit einen sehr langen INSERT und ewig vielen UPDATES zu arbeiten??

            Ich schau mir grad die Dokumentation an und stelle fest, dass es hier ja auch ein REPLACE gäbe.

            Und genau jetzt scheitere ich bzw. jetzt werde ich eine dieser 08/15 Frage stellen.
            Wenn Sie REPLACE angeben, ersetzt die Eingabe vorhandene Datensätze. Dies betrifft Datensätze, die denselben Wert bei einem Primärschlüssel oder einem eindeutigen Index wie die neuen Datensätze haben.
            Wenn ich das richtig verstehe gebe ich für meine INSERT Datensätzen ein 'NULL' ein für die ID, während ich für die UPDATE-Datensätze die 'id' eintrage die ja bekannt ist.

            Geben Sie CONCURRENT bei einer MyISAM-Tabelle an, die die Bedingungen für gleichzeitige Einfügeoperationen erfüllt (d. h. keine freien Blöcke in der Mitte enthält), dann können andere Threads Daten aus der Tabelle abrufen, während LOAD DATA ausgeführt wird. Die Verwendung dieser Option beeinflusst die Leistungsfähigkeit von LOAD DATA auch dann geringfügig, wenn gleichzeitig kein anderer Thread die Tabelle verwendet.
            Freie Blöcke?? Ist damit eine Spalte gemeint, in der kein Wert steht??
            Oder macht es überhaupt keinen Sinn diese Option mit einzusetzen?

            Jedenfalls bin ich jetzt schon sehr zufrieden mit dem Ergebnis
            Zuletzt geändert von web4free; 31.05.2007, 10:41.
            bidgo - Benzin im Blut
            Wir wollen Dich und Deine Karre
            Videoblog & Bilderblog zu verschiedenen Bereichen

            Kommentar


            • #51
              "Freie Blöcke" meint wohl solche: http://de.wikipedia.org/wiki/Datenblock

              Kommentar


              • #52
                Original geschrieben von web4free
                Leider mußte ich diesen Index über die 3 Spalten wieder setzen, weil mir auch wieder eingefallen ist, dass ich den ja bei den Imports benötige, da sonst die Importe länger dauern als die veranschlagten 9 Minuten.
                Alle 10 Minuten läuft der Cron der einen frischen Import anstößt.
                Da mir da gestern 2 Importe länger als 10 Minuten gedauert hatten, hatte ich auf einmal 3 Importe paralell am laufen.
                Vielleicht solltest du, wo du eh gerade am optimieren bist, das auch mal optimieren. Also ein Cron der alle 10 Minuten läuft, sollte nicht auf einem solch abartigen Key setzen müssen x_X

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar


                • #53
                  Original geschrieben von onemorenerd
                  "Freie Blöcke" meint wohl solche: http://de.wikipedia.org/wiki/Datenblock
                  Na ich bin mir nicht sicher ob es das was damit zu tun haben soll?!
                  Ich vermute eher als Datenblock einen leeren Spaltenblock

                  Mein Insert könnte so aussehen:
                  INSERT VALUE(NULL,wert1,wert2,wert3,...);

                  Und jetzt das Beispiel wie ich es verstehe, dass es nicht sein darf:
                  NULL;wert1;;wert3;.....
                  Hier fehlt der wert2 - und das dürfte damit gemeint sein, bin mir aber eben nicht sicher.


                  Vielleicht solltest du, wo du eh gerade am optimieren bist, das auch mal optimieren. Also ein Cron der alle 10 Minuten läuft, sollte nicht auf einem solch abartigen Key setzen müssen x_X
                  Ja hab ich mir auch schon überlegt, komm aber leider auf keinen gescheiteren Nenner.
                  Beim Import eines einzelnen Fahrzeuges frage ich anhand von 3 Werten ab, ob der vielleicht schon in der DB steht.
                  Das ist: Username, int.Nummer und Exporteur
                  Somit finde ich das richtige Fahrzeug ohne versehendlich von einen anderen Händler das Fahrzeug zu ändern.
                  Und meine Überlegung war da halt dieser Index.
                  Ich sehe keine andere Möglichkeit um an die eindeutige DatensatzId rannzukommen.
                  bidgo - Benzin im Blut
                  Wir wollen Dich und Deine Karre
                  Videoblog & Bilderblog zu verschiedenen Bereichen

                  Kommentar


                  • #54
                    ich hab aber gerade eine andere Idee geboren.
                    Was wenn ich noch eine zusätzliche Spalte anlege in der ich als MD5 String User, Int.Nummer und Exporteur reinschreibe und nur dieser den Index gebe?

                    Beispiel:
                    PHP-Code:
                    md5('UserInt.NummerExporteur'); 
                    So hätte ich eine Spalte mit immer exakten 32 Zeichen, welche ja auch eindeutig wären.
                    Klingt vielleicht komisch aber ich denke dass ich hier sicher damit den Index über die 3 Spalten nicht mehr brauchen würde und das ganze auf einen 32 Zeichen Index beschränke.
                    bidgo - Benzin im Blut
                    Wir wollen Dich und Deine Karre
                    Videoblog & Bilderblog zu verschiedenen Bereichen

                    Kommentar


                    • #55
                      Mach diese Spalte auf jeden Fall unique. MD5 ist nicht kollisionsfrei.

                      Kommentar


                      • #56
                        Oder gleich sha1() (hat 40 Zeichen, demnach ein paar mehr Möglichkeiten)

                        Oder auch ganz simpel ein auto_increment unsigned int~ (der wie ich sehe schon vorhanden ist)


                        Wieso hast du denn nicht die ID im Cronjob zum Finden des Datensatzes, sondern nur die 3 Spalten des Index?

                        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                        Wie man Fragen richtig stellt

                        Kommentar


                        • #57
                          Wieso hast du denn nicht die ID im Cronjob zum Finden des Datensatzes, sondern nur die 3 Spalten des Index?
                          Das wäre mir ja eh das liebste, nur wie komme ich easy an die ID rann??
                          Ich erklär ganz kurz nur was da eigendlich bei einen Import passiert.

                          Ich bekomme von einen x-beliebigen Autohändler ein ZIPfile im Mobile.de oder Autoscout24 Format.
                          Das heißt in diesem ZIP-File befinden sich das gesamte Bildmaterial aller seiner Fahrzeuge und ein CSV-File in dem die Liste der Fahrzeuge samt Konfiguration des jeweiligen Fahrzeuges drinnen steht.
                          Hier habe ich keine eindeutige ID welche mit der ID in meiner DB übereinstimmen könnte.

                          Ich habe im Prinzip bei diesem CSV File genau einen Punkt an den ich mich halten kann und das ist die Interne Nummer die der Händler seinen Fahrzeug verpasst hat. Theoretisch auch noch den Hersteller und das Modell - aber bei 2 unterschiedlichen Fahrzeugen wird nie die selbe Int.Nummer vergeben. Auch kann es vorkommen das überhaupt keine interne Nummer drinnen steht. (Da komm ich grad auf einen Bug von mir )
                          Von wo das File gekommen ist (Exporteur) und wie der Username lautet weiß ich ja.

                          Und nun gehts darum, ob ein Fahrzeug völlig neu ist oder sich zB. nur der Preis oder die Bilder bei einen bereits bestehenden Fahrzeug geändert hat.
                          Somit muß ich erst mal dieses KFZ anhand der 3 Dinge in der DB suchen um dann agieren zu können.

                          Zu Beginn unseres Projektes hatte zuerst den gesamten Fuhrpark des Händlers auf den Status 0 gesetzt und dann einen kompletten Neueintrag gemacht - also keine Updates.
                          Nachteil an der Sache war, dass kaum war ein Inserat von Google gespidert und gelistet, war dieses eigendlich auch schon wieder nimmer gültig weil sich die ID geändert hatte.
                          Ausserdem schicken die meisten Händler nur beim allerersten Import alles Bildmaterial mit und dann nur noch Updatebilder zu bestimmten Fahrzeugen und nicht immer alles.

                          Nur die interne Nummer als index oder unique herannzuziehen wäre fatal, weil andere Händler über den selben Exporteur ggf. die selbe interne Nummer haben könnten.

                          Soviel mal zum winzigsten Teil eines solchen Importes.
                          Zuletzt geändert von web4free; 01.06.2007, 11:17.
                          bidgo - Benzin im Blut
                          Wir wollen Dich und Deine Karre
                          Videoblog & Bilderblog zu verschiedenen Bereichen

                          Kommentar


                          • #58
                            Also die Username-Spalte könnte auch immer noch zu einem int werden, was die Sache schon mal merklich vereinfachen würde...
                            Dann könnte man einen Key auf user_id und interne-nr und die ersten paar Stellen des Exporteurs setzen und das ganze sollte schon mal schneller sein ... oder auch bei der internen-nr nur die ersten paar Stellen von der varchar-Spalte

                            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                            Wie man Fragen richtig stellt

                            Kommentar


                            • #59
                              Wenn du mehrere Spalten zum PrimaryKey zusammen fassen kannst, also definieren kannst das diese Spalten Kombination einen Datensatz ein-eindeutig ausmachen, dann kannst du auch mit INSERT ON DUPLICATE KEY UPDATE arbeiten.

                              Damit sparst du dir deinen vorhergehenden Select und machst im Endeffekt das selbe wie mit REPLACE - ich hab nur die Erfahrung gemacht, das INSERT ON DUPLICATE KEY UPDATE schneller ist als REPLACE.

                              Hab mich allerdings jetzt nicht komplett in deine DB-Struktur eingelesen - von daher nur als Idee zu verstehen.

                              Kommentar


                              • #60
                                Also einen Primary-Key auf eine Kombination aus 3 Varchar-Spalten zu legen - davon rate ich jetzt mal spontan ganz dolle ab oO

                                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                                Wie man Fragen richtig stellt

                                Kommentar

                                Lädt...
                                X