Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak dokładnie działają zapytania do bazy danych PHP/MySQL?

Szczegóły zależą od implementacji, ale ogólnie mówiąc, wyniki są buforowane. Wykonywanie zapytania w bazie danych zwróci pewien zestaw wyników. Jeśli jest wystarczająco mały, wszystkie wyniki mogą zostać zwrócone przy początkowym wywołaniu lub niektóre mogą być, a więcej wyników zostanie zwróconych podczas iteracji obiektu wynikowego.

Pomyśl o sekwencji w ten sposób:

  1. Otwierasz połączenie z bazą danych;
  2. Prawdopodobnie istnieje drugie wywołanie w celu wybrania bazy danych lub może być wykonane jako część (1);
  3. Ten etap uwierzytelniania i połączenia to (co najmniej) jedna podróż w obie strony do serwera (ignorowanie trwałych połączeń);
  4. Wykonujesz zapytanie na kliencie;
  5. To zapytanie jest wysyłane na serwer;
  6. Serwer musi określić, jak wykonać zapytanie;
  7. Jeżeli serwer wykonał wcześniej zapytanie, plan wykonania może nadal znajdować się w pamięci podręcznej zapytań. Jeśli nie, należy utworzyć nowy plan;
  8. Serwer wykonuje zapytanie zgodnie z zadanym i zwraca wynik do klienta;
  9. Ten wynik będzie zawierał pewien bufor wierszy, który jest zależny od implementacji. Może to być 100 wierszy lub więcej lub mniej. Wszystkie kolumny są zwracane dla każdego wiersza;
  10. Gdy pobierasz więcej wierszy, w końcu klient poprosi serwer o więcej wierszy. Może to mieć miejsce, gdy klient się wyczerpie lub może to być zrobione zapobiegawczo. Ponownie, jest to zależne od implementacji.

Ideą tego wszystkiego jest zminimalizowanie połączeń w obie strony do serwera bez odsyłania zbyt dużo niepotrzebne dane, dlatego jeśli poprosisz o milion wierszy, nie odzyskasz ich wszystkich na raz.

Klauzule LIMIT — lub w rzeczywistości dowolna klauzula — zmodyfikują zestaw wyników.

Wreszcie (7) jest ważne, ponieważ SELECT * FROM table WHERE a = 'foo' i SELECT * FROM table WHERE a = 'bar' to dwa różne zapytania, jeśli chodzi o optymalizator bazy danych, więc plan wykonania musi być określony dla każdego z osobna. Ale zapytanie parametryczne (SELECT * FROM table WHERE a = :param ) o różnych parametrach to jedno zapytanie i wystarczy je zaplanować tylko raz (przynajmniej do momentu, gdy wypadnie z pamięci podręcznej zapytań).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. python 3.5 - django 1.10 - błąd instalacji mysqlclient Windows 7

  2. Tworzenie systemu licencji

  3. Połącz aws ec2 mysql z moją lokalną aplikacją java

  4. MySQL — BŁĄD 1045 — Odmowa dostępu

  5. Narzędzie do importowania plików CSV do bazy danych MySQL?