DB & Multidimensionales Array

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

  • #31
    wie sieht denn die Abfrage für eine Abfrage von dir aus? Poste doch mal. Es kann doch nicht sein, dass für gerade 3000 DS solange dauert. Es sei denn deine Abfrage ist nicht optimiert, oder Index sind nicht optimal gesetzt.

    Kommentar


    • #32
      Wie der index verteilt ist hab ich schon auf Seite 1 gepostet.

      Das script hab ich jetzt leider nicht bei mir, aber ich poste mal schnell aus dem Kopf was da drinne ist....

      PHP-Code:
      ///Zeitpunkte - Toleranz = +-60sec.
      $now time();
      $stime $now 1209600;
      $stimeA $now 1209660;
      $stimeB $now 1209540;

      while (
      $stime <= $now) {

       
      $sql="SELECT * FROM tabelle WHERE timestamp >= '".$stimeA."' AND timestamp <= '".$stimeB."' AND server_port='".$server_port."' AND server_ip='".$server_ip."' LIMIT 1";
       
      $vztgesql mysql_query($sql) or die(mysql_error());
       
      $vzdaten mysql_fetch_assoc($vztgesql);

       echo 
      'Testabfrage; ID = '.$vzdaten[id].'<BR>';

      $stime $stime 360;


      WHILE (!$asleep) { $sheep++; }

      Kommentar


      • #33
        Hi,

        normalisiere deine tabellen und du bekommst das mit nem
        join und aggregatfunktionen hin *vermut*.

        greets
        (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

        Kommentar


        • #34
          Original geschrieben von closure
          Hi,

          normalisiere deine tabellen und du bekommst das mit nem
          join und aggregatfunktionen hin *vermut*.

          greets
          Uff! Wie muss ich denn...

          Edit:
          Hat jmd nen Link zum Thema normalisieren?
          http://www.tbee.de/mysql/t2_normalisierung.php ist mir zu komplex.

          Ok gechecket. also aufspalten....?
          Zuletzt geändert von nichtsooft; 06.03.2007, 11:59.
          WHILE (!$asleep) { $sheep++; }

          Kommentar


          • #35
            Hi,

            japp aufspalten.

            Zeig uns dann noch mal dein neues schema wenn du es fertig
            hast. Ich bin sicher dass dann die lösung auf dem fusse folgt.

            greets
            (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

            Kommentar


            • #36
              Also ich würde das dann so trennen:

              Tabelle1: (Serverdaten)
              server_id (autoincr), server_ip, server_port, server_query, server_name

              Tabelle2: (Traffic IN)
              server_id, trf_ls_in, trf_ttl_b_in, trf_ttl_p_in, timestamp

              Tabelle3: (Traffic OUT)
              server_id, trf_ls_out, trf_ttl_b_out, trf_ttl_p_out, timestamp

              Tabelle4: (User)
              server_id, user_on, user_max, timestamp

              Edit:

              Tabelle 2 - 4:
              timestamp = key
              server_id = INDEX
              Zuletzt geändert von nichtsooft; 06.03.2007, 12:31.
              WHILE (!$asleep) { $sheep++; }

              Kommentar


              • #37
                Hi,

                sieht doch schon besser aus.

                Und jetzt sagst du nochmal in möglichst einfachen worten
                welche werte du haben möchtest.

                Und dann schauen wir mal ob wir daraus einen query gebastelt bekommen.

                greets
                (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                Kommentar


                • #38
                  Ganz einfach gesagt:

                  Ich brauche folgende Werte:

                  server_ip,
                  server_port,
                  server_query,
                  server_name,
                  trf_ls_in,
                  trf_ttl_b_in,
                  trf_ttl_p_in,
                  trf_ls_out,
                  trf_ttl_b_out,
                  trf_ttl_p_out,
                  user_on,
                  user_max,
                  timestamp

                  @closure: Nur nochmal zur Sicherheit:
                  Mit der Verteilung von KEY und INDEX bist du zufrieden?
                  WHILE (!$asleep) { $sheep++; }

                  Kommentar


                  • #39
                    Hi,

                    naja die server_id sollte in den assoziationstabellen einen index
                    bekommen. Weiterhin sind tabelle 2 und 3 sich ziemlich ähnlich
                    die kann man zusammen fassen und einfach ein weiteres
                    flag feld hinzufügen das angibt ob es sich um IN oder OUT traffic
                    handelt.

                    So du willst aber doch nicht alles haben oder? Für eine statistik
                    sind doch summen der traffics für einen server in einem
                    bestimmten zeitraum interessant oder der durschnittliche traffic
                    pro server.

                    greets

                    [edit]
                    Es läuft vermutlich vereinfacht auf soetwas hinaus
                    Code:
                    SELECT  server.ip,
                                   AVG(traffic_in.amount) AS avg_in,
                                   AVG(traffic_out.amount) AS avg_out,
                                   MAX(traffic_in.amount) AS max_in,
                                   MAX(traffic_out.amount) AS max_out
                    
                     FROM server 
                     INNER JOIN traffic AS traffic_in ON id = traffic_in.server_id AND traffic_in.flag = 0
                     INNER JOIN traffic AS traffic_out ON id = traffic_out.server_id AND traffic_out.flag = 1
                    GROUP BY server.ip
                    Zuletzt geändert von closure; 06.03.2007, 14:37.
                    (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                    Kommentar


                    • #40
                      Also ich hab ja schon viele SQL Abfragen gesehen, aber sowas ^^ ist mir noch nie unter gekommen! *gg*

                      Es ist nur in so fern etwas problematisch, weich ich ja die Werte in einen Graphen respektive eine Graphik einfügen will und so bräuchte ich schon getrennte werte und keine Summen!

                      Und selbstverständlich ein herzliches Dankeschön an closure!
                      WHILE (!$asleep) { $sheep++; }

                      Kommentar


                      • #41
                        Hi,

                        naja für eine gesamtstatistik brauchst du auch
                        die gesamtwerte.
                        Für die details im graphen machst du dann einen separaten
                        query. Sag mal ganz genau welche werte du brauchst und wie
                        sie sich zusammen setzen.

                        Mit einem query wirds nicht klappen aber wir brauchen sicher
                        auch keine 3000

                        greets
                        (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                        Kommentar


                        • #42
                          ok alsoooo.....

                          Gehen wir von dieser Graphik als Vorbild aus:


                          Meine Graphik soll min. 3600px breite haben und eine Höhe von ca. 200px.
                          Sie setzt sich wie folgt zusammen:

                          Durchschnittl. alle 5min. eine Messung in 14 Tagen sind 3600.

                          Bei jeder Messung wird also ein Pixel in der Breite gefüllt.

                          Dafür werden folgende Werte im Hintergrund vollfächig dargestellt.
                          trf_ttl_b_all = trf_ttl_b_in + trf_ttl_b_out (gün)
                          trf_ttl_p_all = trf_ttl_p_in + trf_ttl_p_out (orange)

                          Folgende Werte werden als Vinienverlauf dargestellt:
                          trf_ls_all = trf_ls_in + trf_ls_out (rot)
                          user_on (dunkelblau)
                          user_max (braun)

                          Die Breite beträgt immer wie gesagt 1px, die Höhe wird errechnet (Bsp: wenn trf_ttl_b_all = 10000000 dann ist die Höhe 100px).

                          Das ist der Grund warum ich 3600 brauche *gg*
                          WHILE (!$asleep) { $sheep++; }

                          Kommentar


                          • #43
                            Hi,

                            wie man auf die gesamt ergebnisse kommt sollte dir ja klar sein.

                            Um den verlauf für die 2-wochen-statistik zu machen holst du dir
                            zunächst mal für jeden server die traffic im besagten zeitraum.
                            Das verarbeitest du dann in php weiter zu deinen pixeln.


                            Ich gehe jetzt wieder von der vereinfachten traffic tabelle aus
                            die also nur die server_id das feld amount und ein flag hat das besagt
                            ob es sich um in oder outtraffic handelt.
                            Code:
                            SELECT server.ip AS ip
                                        MAX(all_traffic.amount) AS max_all,
                                        AVG(all_traffic.amount) AS avg_all,
                                        SUM(all_traffic.amount) AS total_all,
                                        GROUP_CONCAT(CONCAT(all_traffic.amount '|'),
                                                    all_traffic.timestamp 
                                                   ORDER BY all_traffic.timestamp SEPARATOR ' & ')
                                                   AS traffic_distribution
                            FROM server
                                       INNER JOIN  traffic AS all_traffic ON server.id = all_traffic.server_id 
                                                                     AND (all_traffic.timestamp >= DATE_SUB(NOW(), INTERVAL 14 DAY) 
                                                                  AND all_traffic.timestamp <= NOW())
                            
                            GROUP BY
                            server.ip
                            Das liefert dir für jeden server ein ergebnis set mit folgendem
                            aussehen:

                            Code:
                            Array( 
                                        [ip] => 127.0.0.1
                                        [max_all] => 167,
                                        [avg_all] => 42,
                                        [total_all] => 7346,
                                        [traffic_distribution] => 10|2007-03-06 15:25:31 & 100|2007-03-06 15:25:48 & 120|2007-03-06 15:26:03
                            )
                            Wobei du traffci_distribution dann weiter verarbeiten musst.
                            Wenn du traffic_distribution nach & aufspaltest erhälst du die
                            einzelnen felder, wobei jedes feld folgender maßen aufgebaut ist.

                            amount|timestamp

                            Das feld kannst du also nach | aufsplitten um deine 5-minuten
                            intervalle zu finden.

                            soweit erstmal. Arbeite das mal aus und wende es auf dein
                            konkretes problem an.

                            greets
                            (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                            Kommentar


                            • #44
                              Erstmal respekt für diese Abfrage und selbstverständlich auch besten Dank!

                              Nun fragt sich allerdings:
                              Ab welcher MySQL Version kann man Flags setzen?

                              Bekomme das nicht gebacken!
                              WHILE (!$asleep) { $sheep++; }

                              Kommentar


                              • #45
                                Hi,

                                hab gar nicht gesehen dass du geantwortet hast.
                                Das flag ist einfach nur ein feld. Meinetwegen vom typ tinyint mit
                                länge 1.
                                Oder ein boolean. Oder ein enum. Nimm was du willst hauptsache
                                du kannst die beiden traffic-typen auseinander halten.

                                greets
                                (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                                Kommentar

                                Lädt...
                                X