Nehmen wir eine einfache FQL
-Abfrage, um alle Links zu erhalten, die die Freunde eines Benutzers seit gestern geteilt haben, zum Beispiel:
Wenn ein Benutzer 50 Freunde hat, wird dies perfekt ausgeführt. Aber wenn ein Benutzer Hunderte von Freunden hat, gibt Facebook oft einen Fehler zurück.
Optionen:
Wie kann ich Facebook entsprechend abfragen, um erfolgreiche Ergebnisse zu gewährleisten?
Hinweise:
Häufige Fehler im Zusammenhang mit Timeout:
1.
%Vor%Zeile 708 ist ein Ausnahmefehler:
%Vor% %Vor%2.
%Vor%Sie sollten mit Limit / Offset durchgehen, wie Sie sagten, oder die Freundesliste im Cache speichern, wie es von puffpio vorgeschlagen wurde.
Sie haben gesagt, dass es immer noch nicht zuverlässig funktioniert - weil einige Benutzer viele, viele Links haben, während andere nicht so viele haben. Beachten Sie auch, dass Sie möglicherweise nicht zwischengespeicherte Daten für einige Benutzer abrufen. Ich würde empfehlen, eine einzige Wiederholung in der Schleife für fehlgeschlagene Abfragen zu haben - es ist oft der Fall, dass die erste Zeit überschritten wird und die zweite aufgrund neu zwischengespeicherter Daten erfolgreich ist.
Schließlich eröffne ich für die Nachwelt eine Aufgabe, um die Verknüpfungstabelle zu optimieren, um effizienter zu sein, wenn sie nach Zeit gefiltert wird.
Einige db-Engines optimieren das IN
-Schlüsselwort nicht oder nicht. Sie können die in-Klausel für jede einzelne resultierende Zeile Ihrer Abfrage ausführen. Können Sie den Link- und Friend-Tabellen beitreten, anstatt ein IN mit einer Unterabfrage zu verwenden?
Sie finden dieser Artikel interessant. (Erläutert Probleme mit der Leistung der IN-Klausel auf MySQL und Facebook führt MySQL am Backend aus.)
Es wäre besser, die Freunde des Benutzers zu cachen und nur gelegentlich zu aktualisieren. Mit anderen Worten, führen Sie diese Abfrage
aus %Vor%Speichern Sie die Liste der Benutzer und führen Sie
aus %Vor%Auf diese Weise führen Sie die innere Abfrage nicht ständig aus. In Wirklichkeit hat die Freundesliste eines Benutzers keine hohe Abwandlungsrate, so dass Sie sie nicht so oft aktualisieren müssen wie die Freigabe-Links.
Zusätzlich können Sie auf diese Weise die zweite Abfrage in mehrere Abfragen mit verschiedenen Gruppen von Eigentümern aufteilen und dann fql.multiquery
verwenden, um alle gleichzeitig abzurufen
Tags und Links facebook facebook-fql