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.
http://stackoverflow.com/questions/858746/how-do-you-select-every-n-throw-from-mysql –
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
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. –