Frage

Ich habe ein paar Stunden damit verbracht, mit diesem zu spielen, ohne Erfolg bisher.

Ich mache eine sehr große Abfrage aus und versuche, sie in Stücke aufzuteilen, bevor ich die Daten verarbeitet. Diese Abfrage wird im Grunde jeden Tag ausgeführt, und eines der Felder ('last_checked') wird verwendet, um sicherzustellen, dass die gleichen Daten nicht mehr als einmal am Tag verarbeitet werden.

Hier ist meine vorhandene Frage;

<cfquery name="getprice" maxrows="100">
  SELECT ID, source, last_checked, price
  FROM product_prices
  WHERE source='api'
  ORDER BY ID ASC
</cfquery> 

Ich führe dann eine CFOutput -Abfrage für die Ergebnisse aus, um verschiedene Updates durchzuführen. Die Tabelle enthält derzeit etwas mehr als 100.000 Rekorde und fängt an, alles in einem Treffer zu verarbeiten, weshalb die Notwendigkeit in Stücke aufgeteilt werden muss.

Meine Absicht ist es, es zu verhindern, dass es von Zeit zu Zeit laufen (ich werde die Maxrows erhöhen und wahrscheinlich alle 15 Minuten laufen lassen). Ich muss jedoch nur Ergebnisse zurückgeben, die nicht innerhalb der letzten 24 Stunden aktualisiert wurden - hier stecke ich fest.

Ich weiß Diejenigen, die ich gelesen habe).

Alle Zeiger haben sehr geschätzt!

War es hilfreich?

Lösung

Versuchen Sie dies zuerst mit MySQL:

SELECT ID, source, last_checked, price
  FROM product_prices
  WHERE source='api'
      AND last_checked >= current_timestamp - INTERVAL 24 HOUR
  ORDER BY ID ASC

Andere Tipps

Ich würde Sie dagegen warnen maxrows=100 in Ihrem CFQuery. Dadurch wird der vollständige Datensatz weiterhin aus der Datenbank an CF zurückgegeben und erst dann alle die ersten 100 Zeilen herausfiltern. Wenn Sie mit einem 100.000 Zeilendatensatz zu tun haben, wird dies sehr teuer sein. Vermutlich verringert Ihr Filter für nur die letzten 24 Stunden die Größe Ihres Basisergebnissatzes drastisch, sodass dies vielleicht kein großes Problem darstellt. Wenn Sie jedoch feststellen, dass Sie selbst durch die Begrenzung Ihres Sets auf diejenigen, die sich innerhalb der letzten 24 Stunden geändert haben, noch sehr große Datensätze zum Arbeiten haben, können Sie die Art und Weise ändern, wie Sie dies tun, um viel effizienter zu arbeiten. Anstatt CF zu verwenden, um Ihre Ergebnisse zu filtern, lassen Sie es MySQL mithilfe des Keywords Limit in Ihrer Abfrage tun:

SELECT ID, source, last_checked, price
  FROM product_prices
  WHERE source='api'
      AND last_checked >= current_timestamp - INTERVAL 1 DAY
  ORDER BY ID ASC
LIMIT 0,100

Sie können auch leicht zwischen "Seiten" von 100 Zeilen einstellen, indem Sie den Offset -Wert vor der Grenze hinzufügen: LIMIT 300, 100 Wären Zeilen 300-400 aus Ihrem Ergebnissatz. Das Paging auf diese Weise zu machen, wird viel schneller sein, als es auf CF zu bringen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top