sql >> Databasteknik >  >> RDS >> Mysql

Hur fungerar PHP/MySQL-databasfrågor exakt?

Detaljerna är implementeringsberoende men allmänt sett, resultaten buffras. Att köra en fråga mot en databas kommer att returnera en viss resultatuppsättning. Om det är tillräckligt litet kan alla resultat returneras med det första anropet eller så kan vissa bli det och fler resultat returneras när du itererar över resultatobjektet.

Tänk på sekvensen så här:

  1. Du öppnar en anslutning till databasen;
  2. Det finns möjligen ett andra anrop för att välja en databas eller så kan det göras som en del av (1);
  3. Autentiserings- och anslutningssteget är (minst) en tur och retur till servern (ignorering av beständiga anslutningar);
  4. Du kör en fråga på klienten;
  5. Frågan skickas till servern;
  6. Servern måste bestämma hur frågan ska köras;
  7. Om servern tidigare har kört frågan kan exekveringsplanen fortfarande finnas i frågecachen. Om inte måste en ny plan skapas;
  8. Servern kör frågan som given och returnerar ett resultat till klienten;
  9. Det resultatet kommer att innehålla någon buffert med rader som är implementeringsberoende. Det kan vara 100 rader eller fler eller färre. Alla kolumner returneras för varje rad;
  10. När du hämtar fler rader så kommer klienten att be servern om fler rader. Det kan vara när klienten tar slut eller så kan det ske förebyggande. Återigen är detta implementeringsberoende.

Tanken med allt detta är att minimera tur och retur till servern utan att skicka tillbaka för mycket onödig data, vilket är anledningen till att om du ber om en miljon rader kommer du inte att få tillbaka alla på en gång.

LIMIT-klausuler - eller vilken klausul som helst - kommer att ändra resultatuppsättningen.

Slutligen är (7) viktigt eftersom SELECT * FROM table WHERE a = 'foo' och SELECT * FROM table WHERE a = 'bar' är två olika frågor när det gäller databasoptimeraren, så en exekveringsplan måste fastställas för varje separat. Men en parametriserad fråga (SELECT * FROM table WHERE a = :param ) med olika parametrar är en fråga och behöver bara planeras en gång (åtminstone tills den faller ur frågecachen).



  1. Vilken sammanställning ska användas så att "ş" och "s" behandlas som unika värden?

  2. beräkna och visa ett datum som "sekunder sedan", "minut sedan", "timmar sedan" etc.

  3. sträng bokstavlig för lång - hur man tilldelar långa xml-data till clob-datatyp i oracle 11g r2

  4. Mysql:BYT DAMN TABELL OM FINNS