2010-02-07 8 views
5

Ich habe MySQL sehr oft verwendet, aber ich habe mich immer gefragt, wie es genau funktioniert - wenn ich ein positives Ergebnis bekomme, wo sind die Daten genau gespeichert? Zum Beispiel schreibe ich wie folgt aus:Wie funktionieren PHP/MySQL Datenbankabfragen genau?

$sql = "SELECT * FROM TABLE"; 
$result = mysql_query($sql); 
while ($row = mysql_fetch_object($result)) { 
    echo $row->column_name; 
} 

Wenn ein Ergebnis zurückgegeben wird, gehe ich davon aus es alle Daten Ergebnisse in der Hand hält oder es in einem Fragment zurückkehrt und nur zurückgibt, wo sie gefragt, wie $ row- > Spaltenname?

Oder gibt es wirklich jede einzelne Zeile von Daten zurück, auch wenn Sie nur eine Spalte in $ result wollten?

Auch, wenn ich mit LIMIT paginieren, hält es das ursprüngliche (alte) Ergebnis, selbst wenn die Datenbank aktualisiert wird?

Antwort

8

Die Details sind implementierungsabhängig, aber allgemein sprechen, Ergebnisse sind gepuffert. Beim Ausführen einer Abfrage für eine Datenbank wird eine Ergebnismenge zurückgegeben. Wenn es ausreichend klein ist, können alle Ergebnisse mit dem ersten Aufruf zurückgegeben werden, oder einige können sein, und es werden mehr Ergebnisse zurückgegeben, wenn Sie über das Ergebnisobjekt iterieren.

Denken der Sequenz auf diese Weise:

  1. Sie öffnen eine Verbindung zur Datenbank;
  2. Es gibt möglicherweise einen zweiten Aufruf, um eine Datenbank auszuwählen, oder es könnte als Teil von (1) ausgeführt werden;
  3. Dieser Authentifizierungs- und Verbindungsschritt ist (mindestens) eine Hin- und Rückfahrt zum Server (permanente Verbindungen werden ignoriert);
  4. Sie führen eine Abfrage auf dem Client aus;
  5. Diese Abfrage wird an den Server gesendet;
  6. Der Server muss bestimmen, wie die Abfrage ausgeführt wird;
  7. Wenn der Server die Abfrage zuvor ausgeführt hat, befindet sich der Ausführungsplan möglicherweise noch im Abfragecache. Wenn nicht, muss ein neuer Plan erstellt werden.
  8. Der Server führt die Abfrage wie angegeben aus und gibt ein Ergebnis an den Client zurück;
  9. Dieses Ergebnis enthält einige Zeilenpuffer, die implementierungsabhängig sind. Es kann 100 Zeilen oder mehr oder weniger sein. Alle Spalten werden für jede Zeile zurückgegeben.
  10. Wenn Sie mehr Zeilen abrufen, fragt der Client den Server nach weiteren Zeilen. Dies kann der Fall sein, wenn der Kunde ausläuft, oder es kann präventiv durchgeführt werden. Auch dies ist implementierungsabhängig.

Die Idee, das alles ist Roundtrip zum Server zu minimieren, ohne zurück zu viele unnötigen Senden von Daten, die warum sind, wenn Sie für eine Million Zeilen fragen Sie nicht, sie alle zurück auf einmal zu bekommen.

LIMIT-Klauseln - oder irgendeine Klausel in der Tat - werden die Ergebnismenge modifizieren.

Schließlich ist (7) wichtig, da SELECT * FROM table WHERE a = 'foo' und SELECT * FROM table WHERE a = 'bar' zwei verschiedene Abfragen sind, soweit der Datenbankoptimierer betroffen ist, so dass ein Ausführungsplan für jedes separat bestimmt werden muss. Eine parametrisierte Abfrage (SELECT * FROM table WHERE a = :param) mit unterschiedlichen Parametern ist jedoch eine Abfrage und muss nur einmal geplant werden (zumindest solange, bis sie aus dem Abfrage-Cache fällt).

+0

Ich habe habe nie verstanden, wie parametrisierte Abfragen funktionieren. Ist es normal, eine parametrisierte Abfrage auszuführen, um 'SELECT * FROM Tabelle WHERE a =: param' an die Datenbank-Engine zusammen mit den Parametern zu senden? Ich dachte '' param' würde durch einen Wert auf der Client-Seite ersetzt werden. – jnylen

+0

Die parametrisierte Abfrage (möglicherweise von der Client-Bibliothek in die von der Datenbank erkannte Transformation transformiert) und der Parameter werden an die Datenbank gesendet. – cletus

1

Die erste Frage kann durch Lesen auf resources

beantwortet werden, da Sie „*“ auswählen, wird jede Spalte für jeden mysql_fetch_object Aufruf zurückgegeben. Schauen Sie sich print_r ($ row) an, um zu sehen.

+1

"Jede Zeile wird für jeden' ​​mysql_fetch_object' Aufruf zurückgegeben ?? " Sicher meinst du jede _Säule_. – jnylen

7

Ich denke, Sie verwirren die beiden Arten von Variablen, mit denen Sie zu tun haben, und keine der beiden Antworten erklären dies wirklich bis jetzt.

$result ist ein MySQL-Ergebnisobjekt. Es enthält keine Zeilen. Wenn Sie $result = mysql_query($sql) sagen, führt MySQL die Abfrage aus und weiß, welche Zeilen übereinstimmen, aber die Daten wurden nicht auf die PHP-Seite übertragen. $result kann als ein Zeiger auf eine Abfrage gedacht werden, die Sie MySQL zur Ausführung aufgefordert haben.

Wenn Sie sagen $row = mysql_fetch_object($result), das ist, wenn PHP MySQL-Schnittstelle eine Zeile für Sie abruft. Nur diese Zeile wird in $row (als ein einfaches altes PHP-Objekt, aber Sie können eine andere Abruffunktion verwenden, um nach einem assoziativen Array oder bestimmten Spalten aus jeder Zeile zu fragen).

Zeilen können gepuffert werden mit die Erwartung, dass Sie alle Zeilen in einer engen Schleife abrufen werden (was normalerweise der Fall ist), aber im Allgemeinen werden Zeilen abgerufen, wenn Sie sie mit einer der Funktionen mysql_fetch_* anfordern.

Wenn Sie nur eine Spalte aus der Datenbank möchten, sollten Sie SELECT that_column FROM .... Die Verwendung einer Klausel LIMIT ist nach Möglichkeit auch eine gute Idee, da MySQL in der Regel erhebliche Optimierungen durchführen kann, wenn es weiß, dass Sie nur eine bestimmte Gruppe von Zeilen benötigen.

0

In einfachen Worten die Ressource zurückgegeben es wie eine ID, die die MySQL-Bibliothek mit anderen Daten verknüpfen. Ich denke, es ist wie die Ausweiskarte in Ihrem Geldbeutel, es ist nur eine Nummer und einige Informationen, aber mit vielen weiteren Informationen verbunden, wenn Sie es der Regierung geben, oder Ihre Handy-Firma, etc.

Verwandte Themen