2012-07-23 12 views
5

Ich bin auf der Suche nach einigen Abfragen mit vorbereiteten Anweisungen auf einer Website mit hohem Traffic zu beschleunigen. Was ich nicht richtig verstehe, ist der Nutzen vorbereiteter Anweisungen, es sei denn, sie können über mehrere Verbindungen vorbereitet bleiben. Es scheint, dass dies mit PDO nicht möglich ist, was auch keine persistenten Verbindungen zulässt. Die persistenten Verbindungsfunktionen erlauben jedoch kein PDO.mysql permanent vorbereitete Anweisungen

können für Argumente willen, ich habe eine Abfrage 5000 Mal pro Sekunde leite: SELECT * FROM some_table WHERE some_column LIKE ‚some_value‘ von neu kompilieren und Auswertung

von dem, was ich verstehe, PDO MySQL würde verhindern, dass die Frage, ob ich "some_value" jedes Mal ändern wollte, wenn ich abfragen musste. Ich verstehe auch, dass "some_value" in Binär statt in ASCII übertragen werden könnte, um Bandbreite zu sparen, aber es würde nicht viel sparen, wenn ich die gesamte Abfrage jedes Mal senden müsste, wenn ich die Verbindung öffne.

auch von dem, was ich gelesen habe, gespeicherte Prozeduren sind nicht die Lösung, denn diese bleiben auch nicht über mehrere Verbindungen kompiliert.

Gibt es eine Lösung für dieses Problem? eine vorbereitete Aussage irgendwo auf dem Server speichern und sie im Speicher kompiliert halten und bereit sein zu feuern, sobald sie die Variablen empfängt?

Gibt es eine Möglichkeit, dies durch die Kombination von Verbindungspooling mit PDO zu erreichen? (Obwohl ich auch gehört habe Connection Pooling ist nicht ideal, weil es unter bestimmten Bedingungen Blockierung verursachen kann)

+0

Wenn Sie persistente Verbindungen verwenden, müssen Sie PDO :: ATTR_PERSISTENT in der Anordnung von Treiberoptionen an das PDO-Konstruktor übergeben . Wenn dieses Attribut nach der Instantiierung des Objekts mit PDO :: setAttribute() festgelegt wird, verwendet der Treiber keine persistenten Verbindungen. –

+1

Warum nicht Memcached verwenden? –

Antwort

0

Verwendung vorbereiteter Anweisungen mit MySQL ist nicht wahrscheinlich, Ihre Abfragen viel schneller zu machen, und es verhindert, dass der Abfrage-Cache funktioniert auch. Sie benötigen etwas Caching vor Ihrer Datenbank, wenn Sie wirklich die gleiche Abfrage 5k/s ausführen müssen. Memcached ist beliebt, ebenso wie Redis. Abhängig davon, was Sie tun, können auch Caching-Elemente oder die gesamte Seite eine Option sein.

+2

Dies ist nicht wahr, die meisten vorbereiteten Aussagen ** sind ** im Cache! Siehe http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html –

+0

Ah, das ist neues Verhalten in 5.1.17, danke. –

5

Nach dem Ausführen zahlreicher Benchmarks fanden wir, dass vorbereitete Anweisungen auf dem Server uns die größten Geschwindigkeitsvorteile zur Verfügung gestellt. Hier ein Beispiel:

DROP PROCEDURE IF EXISTS get_user; 

DELIMITER // 

CREATE PROCEDURE get_user(IN v_user VARCHAR(255)) 
DETERMINISTIC 
READS SQL DATA 
SQL SECURITY INVOKER 
COMMENT '' 
proc: BEGIN 
    SET @user = v_user; 

    IF ISNULL(@get_user_prepared) THEN 
     SET @get_user_prepared = TRUE; 

     SET @sql = "SELECT * FROM mysql.user WHERE user = ?"; 

     PREPARE get_user_stmt FROM @sql; 
    END IF; 

    EXECUTE get_user_stmt USING @user; 
END; 
// 

DELIMITER ; 
+0

Jede native vorbereitete Anweisung, die auf dem Server vorbereitet wird. Sie macht sie jedoch zwischen Verbindungen nicht beständig. –

0

Nein, es gibt keine Möglichkeit, persistent vorbereitete Anweisungen zu verwenden.

Allerdings gibt es eine ideale Lösung für die Abfrage ausgeführt werden 5000-mal pro Sekunde - Handlersocket

Verwandte Themen