sql >> Database >  >> RDS >> Mysql

Hoe werken PHP/MySQL-databasequery's precies?

De details zijn afhankelijk van de implementatie, maar in het algemeen gesproken, de resultaten worden gebufferd. Als u een query uitvoert op een database, wordt een resultaatset geretourneerd. Als het voldoende klein is, kunnen alle resultaten worden geretourneerd met de eerste aanroep of sommige zijn mogelijk en meer resultaten worden geretourneerd terwijl u het resultaatobject herhaalt.

Denk aan de volgorde op deze manier:

  1. U opent een verbinding met de database;
  2. Er is mogelijk een tweede oproep om een ​​database te selecteren of het kan worden gedaan als onderdeel van (1);
  3. Die authenticatie- en verbindingsstap is (minstens) één retourtje naar de server (permanente verbindingen negerend);
  4. U voert een query uit op de client;
  5. Die vraag wordt naar de server gestuurd;
  6. De server moet bepalen hoe de query moet worden uitgevoerd;
  7. Als de server de query eerder heeft uitgevoerd, bevindt het uitvoeringsplan zich mogelijk nog steeds in de querycache. Zo niet, dan moet er een nieuw plan worden gemaakt;
  8. De server voert de query uit zoals opgegeven en retourneert een resultaat naar de client;
  9. Dat resultaat zal een buffer met rijen bevatten die afhankelijk is van de implementatie. Het kunnen 100 rijen of meer of minder zijn. Alle kolommen worden geretourneerd voor elke rij;
  10. Naarmate je meer rijen ophaalt, zal de client de server uiteindelijk om meer rijen vragen. Dit kan zijn wanneer de klant op is of het kan preventief worden gedaan. Nogmaals, dit is afhankelijk van de implementatie.

Het idee van dit alles is om retourvluchten naar de server te minimaliseren zonder te veel terug te sturen onnodige gegevens, daarom krijgt u ze niet allemaal in één keer terug als u om een ​​miljoen rijen vraagt.

LIMIT-clausules - of welke clausule dan ook - zullen de resultatenset wijzigen.

Ten slotte is (7) belangrijk omdat SELECT * FROM table WHERE a = 'foo' en SELECT * FROM table WHERE a = 'bar' zijn twee verschillende queries voor wat betreft de database-optimizer, dus voor elk afzonderlijk moet een uitvoeringsplan worden bepaald. Maar een geparametriseerde query (SELECT * FROM table WHERE a = :param ) met verschillende parameters is één query en hoeft maar één keer te worden gepland (tenminste totdat deze uit de querycache valt).



  1. Hoe voer ik een IF...THEN uit in een SQL SELECT?

  2. Arrayvariabele maken in MySQL

  3. Tabel met coördinaten van een zeshoekig raster dat de wereld bedekt

  4. Wat is er nieuw in MariaDB MaxScale 2.4