Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie lässt sich eine MySQL-Abfrage in PHP ständig aktualisieren?

Sie stecken mit dem Polling mit Ihrem aktuellen Tech-Stack fest. MySQL hat keine gute Möglichkeit, Ihnen eine Benachrichtigung zu schicken, dass es etwas Neues zu sehen gibt.

(Sie könnten erwägen, ein Nachrichtenwarteschlangen-Subsystem hinzuzufügen, wie zum Beispiel RabbitMQ, aber das würde eine große Änderung an der Struktur Ihrer Anwendung erfordern).

Einige Richtlinien für den Umgang mit Polling zu den geringstmöglichen Kosten.

  1. Setzen Sie die Benutzererwartungen auf einige Sekunden Latenzzeit für die Nachrichten anstatt auf Millisekunden.

  2. Fragen Sie so oft wie nötig ab, um die Latenzerwartungen zu erfüllen.

  3. Vermeiden Sie es, bei jeder Abfrage viele Daten abzufragen. Wie können Sie das tun?

    a. Speichern Sie den aktuellsten Zeitstempel, wenn Sie eine Abfrage ausführen

    b. Verwenden Sie nicht SELECT * . Geben Sie stattdessen die Namen der tatsächlich benötigten Spalten an. Dadurch kann der Optimierer von MySQL helfen, die Kosten Ihrer Abfragen zu senken.

    c. Lassen Sie Ihre Abfragen SELECT whatever WHERE timestamp > saved_timestamp ORDER BY timestamp ausführen Sie erhalten also nur neue Artikel von Ihrem Tisch, in der richtigen Reihenfolge. Wenn Ihr System nicht sehr ausgelastet ist, werden diese SELECTs oft keine Zeilen zurückgeben. Das ist gut.

    d. Stellen Sie sicher, dass Sie einen mehrspaltigen Index für timestamp und die anderen Spalten in Ihrer SELECT-Anweisung haben. Dies wird als deckender Index bezeichnet .

    e. Geben Sie direkt nach dem Öffnen Ihrer Verbindung zu MySQL diese SQL-Anweisung aus. Dadurch kann MySQL Ihre Daten mit weniger Konflikten mit anderen MySQL-Clients abrufen, die Zeilen in die Tabelle einfügen.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

Wenn Sie dies mit AJAX von den Browsern Ihrer Benutzer tun, möchten Sie den neuesten Zeitstempel in die AJAX-Anforderungen aufnehmen, damit Sie die erforderlichen neuen Elemente an den Browser jedes Benutzers liefern können.