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

PHP PDO:Wie wirkt sich das erneute Vorbereiten einer Anweisung auf die Leistung aus?

MySQL speichert (wie die meisten DBMS) Ausführungspläne für vorbereitete Anweisungen, wenn Benutzer A also einen Plan erstellt für:

SELECT * FROM some_table WHERE a_col=:v1 AND b_col=:v2

(wobei v1 und v2 bind vars sind) sendet dann Werte, die vom DBMS interpoliert werden sollen, dann sendet Benutzer B dieselbe Abfrage (aber mit unterschiedlichen Werten für die Interpolation), das DBMS muss den Plan nicht neu generieren. d.h. es ist das DBMS, das den passenden Plan findet - nicht PDO.

Dies bedeutet jedoch, dass jede Operation in der Datenbank mindestens 2 Roundtrips erfordert (der erste zum Präsentieren der Abfrage, der zweite zum Präsentieren der Bind-Variablen) im Gegensatz zu einem einzelnen Roundtrip für eine Abfrage mit Literalwerten, dann führt dies zu zusätzlichen Netzwerkkosten . Die Dereferenzierung (und Wartung) des Abfrage-/Plan-Cache ist auch mit geringen Kosten verbunden.

Die Schlüsselfrage ist, ob diese Kosten höher sind als die Kosten für die eigentliche Erstellung des Plans.

Während es (meiner Erfahrung nach) definitiv einen Leistungsvorteil bei der Verwendung vorbereiteter Anweisungen mit Oracle zu geben scheint, bin ich nicht davon überzeugt, dass dies auch für MySQL gilt - es hängt jedoch viel von der Struktur Ihrer Datenbank und der Komplexität der ab Abfrage (oder genauer gesagt, wie viele verschiedene Optionen der Optimierer zum Auflösen der Abfrage finden kann).

Versuchen Sie es selbst zu messen (Tipp:Sie sollten den Schwellenwert für langsame Abfragen auf 0 setzen und Code schreiben, um Literalwerte wieder in anonyme Darstellungen für die in die Protokolle geschriebenen Abfragen umzuwandeln).