2012-07-23 5 views
5

Szukam przyspieszenia niektórych zapytań za pomocą przygotowanych oświadczeń na stronie o dużym natężeniu ruchu. to, co nie wydaje mi się, że rozumiem poprawnie, to korzyść płynąca z używania przygotowanych stwierdzeń, chyba że mogą pozostać przygotowani na wiele połączeń. wygląda na to, że nie jest to możliwe z PDO, który również nie pozwala na trwałe połączenia. ale trwałe funkcje połączenia nie pozwalają na PDO.mysql trwale przygotowane oświadczenia

powiedzmy argumentów sake Używam kwerendy 5000 razy na sekundę: select * from some_table GDZIE some_column LIKE 'some_value'

z tego co rozumiem, PDO uniemożliwiłyby mysql z ponownej kompilacji i oceny zapytanie, czy miałbym zmienić "some_value" za każdym razem, gdy potrzebowałem zapytania. Rozumiem również, że "some_value" może być przesyłane w postaci binarnej zamiast ASCII, aby zaoszczędzić przepustowość, ale nie oszczędziłoby to wiele, gdybym musiał wysłać całe zapytanie za każdym razem, gdy otwierałem połączenie.

również z tego, co przeczytałem, procedur przechowywanych nie są rozwiązaniem, ponieważ te nie pozostają kompilowane za pośrednictwem wielu połączeń.

Czy jest jakieś rozwiązanie tego problemu? przechowywanie gdzieś przygotowanego oświadczenia na serwerze i pozostawienie go w pamięci i gotowe do strzału, gdy tylko otrzyma zmienne?

Czy jest jakiś sposób, aby to się stało, łącząc połączenie puli z PDO? (chociaż słyszałem również, że łączenie puli nie jest idealne, ponieważ może powodować blokowanie w pewnych warunkach)

+0

Jeśli chcesz użyć trwałych połączeń, należy ustawić PDO :: ATTR_PERSISTENT w gamie opcji sterownika przekazany do konstruktora PDO . Jeśli ustawienie tego atrybutu przy użyciu PDO :: setAttribute() po utworzeniu obiektu, sterownik nie będzie używać połączeń trwałych. –

+1

Dlaczego nie używać Memcached? –

Odpowiedz

0

Korzystanie z przygotowanych instrukcji za pomocą MySQL prawdopodobnie nie przyspieszy twoich zapytań i uniemożliwi działanie pamięci podręcznej zapytań. Potrzebujesz pamięci podręcznej przed bazą danych, jeśli naprawdę potrzebujesz uruchomić to samo zapytanie 5k/s. Memcached jest popularny, podobnie jak Redis. W zależności od tego, co robisz, opcja buforowania elementów lub cała strona też może być opcją.

+2

To nie jest prawda, najlepiej przygotowane instrukcje ** są ** buforowane! Zobacz http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html –

+0

Ah, to jest nowe zachowanie w 5.1.17, dziękuję. –

5

Po wykonaniu wielu testów porównawczych okazało się, że przygotowane wyciągi przygotowane na na serwerze zapewniły nam największe korzyści prędkości. Oto przykład:

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

Każda natywna przygotowana instrukcja przygotowywana na serwerze. Nie powoduje to jednak, że są trwałe między połączeniami. –

0

Nie, nie ma sposobu na użycie trwałych przygotowanych wyciągów.

Jednak nie jest to idealne rozwiązanie dla zapytania bieżącą 5000 razy na sekundę - Handlersocket