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.
DB & Multidimensionales Array
Einklappen
X
-
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
-
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
-
Original geschrieben von closure
Hi,
normalisiere deine tabellen und du bekommst das mit nem
join und aggregatfunktionen hin *vermut*.
greets
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, 12:59.WHILE (!$asleep) { $sheep++; }
Kommentar
-
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
-
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 = INDEXZuletzt geändert von nichtsooft; 06.03.2007, 13:31.WHILE (!$asleep) { $sheep++; }
Kommentar
-
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
-
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
-
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, 15:37.(((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")
Kommentar
-
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
-
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
-
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
-
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
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 )
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
-
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
Kommentar