sql >> Database teknologi >  >> RDS >> Mysql

Hvordan fungerer PHP/MySQL-databaseforespørgsler præcist?

Detaljerne er implementeringsafhængige, men generelt talt, resultater er bufferet. Udførelse af en forespørgsel mod en database vil returnere et resultatsæt. Hvis den er tilstrækkelig lille, kan alle resultater returneres med det indledende kald, eller nogle kan være det, og flere resultater returneres, når du itererer over resultatobjektet.

Tænk på rækkefølgen på denne måde:

  1. Du åbner en forbindelse til databasen;
  2. Der er muligvis et andet kald for at vælge en database, eller det kan gøres som en del af (1);
  3. Dette godkendelses- og forbindelsestrin er (mindst) én tur-retur til serveren (ignorerer vedvarende forbindelser);
  4. Du udfører en forespørgsel på klienten;
  5. Denne forespørgsel sendes til serveren;
  6. Serveren skal bestemme, hvordan forespørgslen skal udføres;
  7. Hvis serveren tidligere har udført forespørgslen, kan eksekveringsplanen stadig være i forespørgselscachen. Hvis ikke skal der oprettes en ny plan;
  8. Serveren udfører forespørgslen som givet og returnerer et resultat til klienten;
  9. Dette resultat vil indeholde en buffer af rækker, der er implementeringsafhængig. Det kan være 100 rækker eller flere eller færre. Alle kolonner returneres for hver række;
  10. Når du henter flere rækker, vil klienten bede serveren om flere rækker. Det kan være, når klienten løber tør, eller det kan ske præventivt. Igen er dette implementeringsafhængigt.

Ideen med alt dette er at minimere rundrejser til serveren uden at sende for meget tilbage unødvendige data, hvilket er grunden til, at hvis du beder om en million rækker, vil du ikke få dem alle tilbage på én gang.

LIMIT-klausuler--eller en hvilken som helst klausul i virkeligheden--vil ændre resultatsættet.

Endelig er (7) vigtigt, fordi SELECT * FROM table WHERE a = 'foo' og SELECT * FROM table WHERE a = 'bar' er to forskellige forespørgsler, hvad angår databaseoptimeringsværktøjet, så en udførelsesplan skal fastlægges for hver enkelt. Men en parameteriseret forespørgsel (SELECT * FROM table WHERE a = :param ) med forskellige parametre er én forespørgsel og skal kun planlægges én gang (i hvert fald indtil den falder ud af forespørgselscachen).



  1. Hvorfor forbedrer TRANSACTION / COMMIT ydeevnen så meget med PHP/MySQL (InnoDB)?

  2. postgres db filer - hvilken fil repræsenterer den specifikke tabel/indeks?

  3. FEJL 1045 (28000):Adgang nægtet for brugeren 'root'@'localhost' (ved hjælp af adgangskode:NEJ)

  4. sql server vælg kolonne efter nummer