Querry für Fortgeschrittene ;)

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

  • Querry für Fortgeschrittene ;)

    Morgen! ^^

    Ich hab da einen - meiner Meinung nach - komplizierten Querry zu machen und wollte fragen, wie ich das am besten angehen sollte um die Geschwindigkeit, respektive Performance der DB nicht zu gefährden.

    Die DB:
    Ich hab eine DB die Daten über ca. 320 Server aufzeichnet. Hier werden mitunter Port, Traffic_out, Traffic_in, Clients, timestamp (sec), uvm. stündlich festgehalten.
    Dies erledigen 13 Crons alle 3min. für je ca. 25 Server. Also so:
    0 * * * * erstens
    3 * * * * zweitens
    usw....
    Es geht jetzt darum die Clients aller Server zu addieren, jedoch sollte kein Server 2x gezählt werden. Einfach DESC auslesen mit Limit "alle Server" läuft nicht, da sich die Anzahl der Server ständig ändert.

    Sone Thematik in Worte zu fassen ist schwierig, wenn jmd will kann ich ne Grafik der DB posten.

    Danke schon mal für eure Comments.
    WHILE (!$asleep) { $sheep++; }

  • #2
    mit MAX() und GroupBy?

    Kommentar


    • #3
      Läuft MAX() auf MySQL 4.1 ^^
      Ich hätte da eigentlich versucht mich da mit den Zeit -und Datumsfunktionen durchzuackern...



      Edit:
      Also laut Tobi hol ich mir einfach die höchsten timestamps...
      Kann ich den Additionsvorgang der Clients nicht gleich im Querry durchführen, oder würde mir dann der DB-Server glühen?
      Zuletzt geändert von nichtsooft; 26.11.2007, 08:29.
      WHILE (!$asleep) { $sheep++; }

      Kommentar


      • #4
        Dann eben SUM() und GROUP BY?! 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


        • #5
          Ok; Da ich irgendwie befürchte, dass wir aneinander vorbei reden hier doch ein kleiner screenshot und ein nochmaliger Erklärungsversuch:



          Es existiert nicht immer nur eine Zeile Pro Server, sondern n Zeilen pro Server mit unterschiedl. timestamp.

          Ich check nicht ganz warum sowohl Tobi als auch Gambler ein Group vorschlagen, aber wenn es beide Meinen bin ich davon überzeugt, daß das schon nen Sinn haben wird!
          Viell. könnt ihr mir erläutern warum und nach welchem Wert ihr gruppieren würdet.


          Edit:
          PHP-Code:
          SELECT SUM(trf_ttl_b_out,trf_ttl_b_in) AS trf_ttl FROM tabelle GROUP BY server_query 
          Das wären ALLE Zeilen addiert. Aber wie sortiere ich jetzt mit MAX den letzten Eintrag pro Server raus!?

          Edit2:
          Öhm ich hab hier mal den Traffic addiert, würde aber mit user_on genau so laufen, bloß das der resultierende Wert ein wenig kleiner ist. *g+
          Zuletzt geändert von nichtsooft; 26.11.2007, 11:06.
          WHILE (!$asleep) { $sheep++; }

          Kommentar


          • #6
            Das wären ALLE Zeilen addiert. Aber wie sortiere ich jetzt mit MAX den letzten Eintrag pro Server raus!?
            Vielleicht verstehe ich dein Problem nicht richtig, aber eigentlich ist das genau das, was GROUP BY tut. Es gruppiert nach etwas, um damit solche Funktionen wie MAX oder SUM auf diese Gruppen anwenden zu können.

            Du müsstest dann entsprechend nach der Serverid gruppieren.
            ich glaube

            Kommentar


            • #7
              Original geschrieben von ministry
              Vielleicht verstehe ich dein Problem nicht richtig, aber eigentlich ist das genau das, was GROUP BY tut. Es gruppiert nach etwas, um damit solche Funktionen wie MAX oder SUM auf diese Gruppen anwenden zu können.

              Du müsstest dann entsprechend nach der Serverid gruppieren.
              Ja ne ist klar; Ich versuch's mal mit ner PseudoDefinition des Ergebnisses:

              Array:
              [0][0] user_on_gesammt
              [0][1] timestamp
              [1][0] user_on_gesammt
              [1][1] timestamp

              Bsp:
              [0][0] 1100
              [0][1] 1196070125
              [1][0] 868
              [1][1] 1196073725
              WHILE (!$asleep) { $sheep++; }

              Kommentar


              • #8
                Jetzt sprichst du nicht mehr von "pro Server" sondern "pro Timestamp" und müsstest entsprechend nach dem Timestamp gruppieren.

                Wo ist das Problem?
                ich glaube

                Kommentar


                • #9
                  Nebenbei: Ich glaube auch!

                  Also back to Topic...
                  Der Ansatz wäre dann:
                  PHP-Code:
                  SELECT SUM(user_on) AS user_ttl_on FROM tabelle GROUP BY timestamp 
                  Richtig?
                  WHILE (!$asleep) { $sheep++; }

                  Kommentar


                  • #10
                    Ja, und den Timestamp kannst du dann gleich mitselektieren.
                    ich glaube

                    Kommentar


                    • #11
                      Danke so weit mal!

                      Jetzt bleibt nur noch das Problemchen dass die Abfrage nicht wirklich addiert!

                      Edit:
                      Öhm whoops! Addiert doch jedoch nicht ganz richtig!

                      Siehe hier:
                      http://tswebtec.com/08/forums/siteincludes/2gfx.php


                      Das liegt daran, dass wie ich schon gesagt habe mehrere CRONS mit Abstand von immer 3min. die Daten einlesen!

                      Jetzt müsste man noch irgendwie diesen unterschied mit einberechnen und dann die entsprechenden Groups addieren... *seufz*
                      Zuletzt geändert von nichtsooft; 26.11.2007, 12:32.
                      WHILE (!$asleep) { $sheep++; }

                      Kommentar


                      • #12
                        Die Timestamps müssen natürlich dann identische sein.

                        Zeig mal Query und Ergebnis.

                        Edit: Was ist denn daran verkehrt?
                        ich glaube

                        Kommentar


                        • #13
                          Query:
                          PHP-Code:
                          SELECT SUM(user_on) AS user_ttl_ontimestamp FROM tsserverstats GROUP BY timestamp 
                          Ergebnis:
                          http://tswebtec.com/08/forums/siteincludes/2gfx.php

                          Problematik: Siehe Edit vom letzen Post...
                          WHILE (!$asleep) { $sheep++; }

                          Kommentar


                          • #14
                            Du gibst aus, wieviele User jeweils zu bestimmten Zeitpunkten auf allen Servern zusammen online waren.

                            Was ist daran falsch, und was für einen Unterschied meinst du?
                            ich glaube

                            Kommentar


                            • #15
                              Da muss ich ein bisserl weiter ausholen!

                              Die Server sind der Übersicht halber in Realms geteilt. Pro Realm ~25 Server.

                              Jeder dieser Realms trägt Stündlich die Daten seiner Server in die DB ein; Das sieht so aus:

                              1. Realm 12:00 Uhr -> trägt Daten ein
                              2. Realm 12:03 Uhr -> trägt Daten ein
                              ......
                              13. Realm 12:39 Uhr -> trägt Daten ein

                              Eine Stunde später wiederholt sich das ganze Spiel!
                              WHILE (!$asleep) { $sheep++; }

                              Kommentar

                              Lädt...
                              X