2013-11-15 7 views
6

Ich arbeite mit einer App, die phpActiveRecord und mySQL verwendet, um Daten aus einem Sensornetzwerk einzuziehen und es auf eine Reihe von flot.js Graphen auf dem Client zu zeichnen.Zurückgeben jeder zweiten Zeile einer SQL-Abfrage

Es gibt mehrere Zeitfenster, zwischen denen der Benutzer wählen kann, um den Datenbereich zu beeinflussen, den die Graphen anzeigen. 2hrs, 24hrs, 3 days and 1 week.

Die Sensoren posten alle 60 Sekunden in die Datenbank. Wenn also die Graphen geplottet werden, zieht die Abfrage alle Zeilen zwischen now and DATE_SUB(CUR_DATE - INTERVAL ? DAY) wo? ist entweder 1, 3 oder 7 usw.

Dies führt jedoch zu einer massiven Anzahl von Zeilen zurückgegeben wird (60,000 + for the full week!) und verursacht große Verzögerungen und Serverfehler.

Ich weiß, ich kann nur den maximalen Speicher für Abfragen in der php.ini Datei massiv erhöhen, aber das ist kaum eine gute Lösung und löst nicht das Problem der Geschwindigkeit.

Meine Frage ist, gibt es eine Möglichkeit, kann ich einfach nur jede zweite oder dritte Zeile aus dem erforderlichen Zeitraum auswählen, abhängig von der Länge des Intervalls, das der Benutzer anzeigen möchte?

In C oder Java würde ich so etwas wie eine Modulo-Auswahl tun, um alternative Zeilen zurückzugeben, aber ich kann mir keine Möglichkeit vorstellen, dies im aktuellen Framework zu tun.

Irgendwelche Ideen würden geschätzt. Vielen Dank.

+3

http://stackoverflow.com/questions/858746/how-do-you-select-every-n-throw-from-mysql –

+0

Danke Josh, das sind großartige Links, aber leider die Art und Weise, wie die App ist strukturiert und dynamisch generiert bedeutet, dass die Verwendung von Benutzervariablen grundsätzlich nicht in Frage kommt. Die Abfragen werden vom Slim.js-Routing-Framework verwaltet und nicht direkt von der Browser-Seite aufgerufen. Ich weiß es zu schätzen! Vielen Dank. – bisslad

+1

Wenn Ihre ID inkrementell ist, könnten Sie das verwenden (fügen Sie ein "is odd" wie oder ist ein Vielfaches von 4/8 und so weiter zu Ihrer WHERE-Anweisung) Außerdem: Haben Sie überlegt, Caching für Ihre Abfragen zu verwenden?Selbst wenn Sie einfach mysql_result_cache verwenden würden, würden Sie Ihre Leistung erheblich steigern. –

Antwort

0
<? 
$row = 1; 
WHILE QUERY { 
    if ($row % 2 == 0) { 
     echo "Yourstuff"; 
    } else { 
     //Nothing 
    } 
    $row++; 
} 
?> 

Dies sollten Sie über eine solution..maybe nicht das perfekte für Sie zu denken, helfen, aber ich hoffe, dass es ... hilft 3 Für jede dritte Reihe% Einsatz $ und so weiter ...

+1

Es ist wie 60.000 Bonbons vom Markt (Datenbank) nach Hause zu bringen und dann zu sagen Nein, ich brauche nur jeden zweiten und nicht den Rest. Warum sie überhaupt vom Markt (Datenbank) holen? Warum nicht gleich entscheiden, was man mit nach Hause nehmen soll (nach php) –

+0

Ich muss diese Art von Lösung ausprobieren, denke ich. Ich hatte gehofft, dass ich nicht mehr tausende kleinere Anfragen generieren musste, aber das könnte der einzige Weg sein, dies zu tun. Will testen und akzeptieren, wenn ich das aufbringe. – bisslad

+0

@Hanky ​​Panky: Das sollte keine komplette Lösung sein ... aber nur eine Sache, die ihm vielleicht hilft, auf den richtigen Weg zu kommen ... Eine andere Lösung wäre, für jede Zeile eine Abfrage zu machen ... Ich brauche kontinuierliche ID's ... aber ich weiß nicht, ob eine Abfrage für jede auszugebende Zeile schneller wäre ... –

0

Versuchen: auch nicht ideale Lösung

$i = 0; 
foreach($row as $data){ 
    if($i == 1){ 
    //Do whatever with your 2n record 
    $i++; 
    } 
    if($i > 1){$i = 0;} //Reset the counter 
} 
+3

Also, wo erhöhen Sie $ i;) – douwe

+0

Ha, gut entdeckt. Sorry, korrigierte meine Antwort – ggdx

+0

Um ehrlich zu sein, zu der Zeit, in der es in PHP ist, haben Sie schon die Hälfte des Problems verpasst. Ja, Sie vermeiden es, es an den Client zu senden, aber Sie holen es immer noch von der Festplatte der Datenbank, übertragen es über das Netzwerk zu PHP, speichern es im Speicher, etc, etc ... Das ist besser als nichts aber nicht die richtige Lösung – Basic

0

jede zweite Reihe zurückkehrend. Sie können den Cache verwenden.

Der einfachste Weg ist das Zwischenspeichern Ihres Tisches an einem anderen Tisch. Konfigurieren Sie den automatischen Cron-Job regelmäßig.

datas 
datas_cache (Only Results) 

Wenn Sie mehr professionelle Lösung Sie müssen Ihr Ergebnis in Dateien verwenden JSON

0

Am Ende habe ich die Verwaltung kann am Ende cachen die Zeilen auszuwählen, wie oben angegeben.

Allerdings war dies keine akzeptable Lösung für das Problem, das ich hatte, also habe ich beschlossen, zu versuchen, meine Graphen Server-Seite zu generieren, um zu versuchen, das Problem insgesamt zu vermeiden. Es erscheint logisch, dass das Erzeugen von Diagrammen mit so vielen Datenpunkten auf dem Server durchgeführt wird und einfach ein Bild auf dem Draht zu einem HTML5-Canvas oder ähnlichem geschoben wird. Ich werde pChart dafür ausprobieren. Danke an alle Responder auf jeden Fall.