HP-Schicht zu MySQL-Schicht
PHP-zu-SQL-Komponentenhierarchie ist wie unten dargestellt:
ext/mysqli und ext/mysql sind Clientseitige Erweiterungsbibliothek (Bibliotheksfunktion), eine Erweiterungsbibliothek auf clientseitiger Skriptebene. Die MySQL-Bibliothek ist eine erweiterte Version der MySQL-Bibliothek. Die erweiterte Version fügt Spaltenbindung (Bind Column) hinzu. PDO (PHP Data Object) ist eine weitere datenobjektorientierte Erweiterungsbibliothek. Diese Erweiterungsbibliotheken richten sich direkt an Programmierer und ihre zugrunde liegende Implementierung ist die MySQL-Verbindungs-Engine (z. B. mysqlnd und libmysql) (siehe http://bbs.chinaunix.net/thread-3679393-1-1.html, http: //blog .csdn.net/treesky/article/details/7286098).
mysqlnd und libmysql sind die Datenbankverbindungstreiber-Engines der PHP-Seite (Client). libmysql ist eine allgemeine Datenbankverbindungs-Engine, während mysqlnd eine exklusiv für PHP entwickelte Verbindungs-Engine ist und zu Zend gehört. Wenn PHP eine Datenbankabfrage durch Aufruf der Funktion mysql_query() in der Erweiterungsbibliothek (ext/mysqli und ext/mysql) durchführt, sendet die Zend-Engine über die MySQL-Abfrage-Engine (mysqlnd und libmysql) eine Abfrageanforderung an den MySQL-Server.
Datenabfrage auf MySQL-Ebene
Nachdem der MySQL-Server die Abfrageanforderung des Clients empfangen hat, ist der Abfrageausführungsprozess wie in der Abbildung oben dargestellt:
1. Abfrage-Cache: Bei einem Treffer wird die Ergebnismenge direkt an den Client zurückgegeben. Andernfalls fahren Sie mit Schritt 2 fort.
2. Führen Sie nacheinander Parsen, Vorverarbeitung, Abfrageoptimierung und andere Vorgänge für die SQL-Anweisung durch und generieren Sie sie schließlich ein Abfrageausführungsplan (der Abfrageausführungsplan von select kann über „explain select“ angezeigt werden)
3. Die Abfrageausführungs-Engine des MySQL-Servers ruft die Speicher-Engine auf, um die Daten gemäß dem Abfrageausführungsplan abzufragen. Wenn die letzte Verknüpfungsebene der SQL-Anweisung ausgeführt wird, wird der Abfrageergebnissatz generiert
4. Der Abfrageergebnissatz wird an den Client gesendet und es gibt zwei Möglichkeiten, ihn zurückzugeben: Der MySQL-Server speichert das Ergebnis zwischen festgelegt oder nicht zwischengespeichert. Dies wird dadurch bestimmt, dass der Parameter SQL_BUFFER_RESULT festgelegt ist. Und wenn der Benutzer SQL_CACHE festlegt, wird eine Kopie des Ergebnissatzes dieser Abfrage im Abfragecache gespeichert (relevant für Schritt 1).
Erklärung des SQL_CACHE-Parameters:
Komplexe (mehrfach zugeordnete) Abfragen in mehrere einfache Abfragen zerlegen, da
1) Cache-Treffer für einfache Abfragen,
2) komplex Der Cache der Abfrageergebnisse ist fehleranfällig (zu viele Tabellen sind verknüpft)
3) Die Halterate der einfachen Abfragesperre ist niedrig
MySQL Server zur PHP-Schicht
Kommunikationsmodus MySQL Server- und Client-Kommunikation Verwenden Sie „ „Halbduplex-Kommunikation“, was bedeutet: Nur einer von Client und Server kann lesend sein, der andere muss schreibend sein.
Vorteile: Das Protokoll ist einfach und die Schreibberechtigungen von Client und Server schließen sich gegenseitig aus
Nachteile: Eine Flusskontrolle ist nicht möglich, ein Ende beginnt mit dem Senden einer Nachricht und das andere Ende muss die Nachricht vollständig akzeptieren.
Erleuchtung: Die Ergebnismenge nach der Serverabfrage wird an den Client gesendet, und der Client (die Abfrage-Engine des Clients, z. B. mysqlnd) muss sie vollständig akzeptieren. Wenn Sie also nur ein paar Zeilen benötigen, denken Sie daran, limit zur SQL-Anweisung hinzuzufügen und select * sparsam zu verwenden.
Ergebnissatz-Rückgabemodus Bei der Ergebnissatz-Rückgabe wird jede Datensatzzeile über das Client-Server-Kommunikationsprotokoll gepackt und dann natürlich auf der TCP-Ebene für jede Zeile an das niedrigere TCP-Protokoll übergeben kann zunächst zwischengespeichert werden. Die zeilenweise aufgezeichneten Protokollpakete werden aus großen Paketen zusammengesetzt und versendet (transparent für die Anwendungsschicht).
Der MySQL-Server kann den vom Ergebnissatz belegten Puffer erst freigeben, nachdem er alle Ergebnissätze an den Client gesendet hat.
Server-Cache-Modus
Client-Befehl: mysql_unbuffer_query(), im Cache der SQL-Treibererweiterung (mysqlnd) des Clients wird kein Ergebnissatz festgelegt. Wenn also feth_array_xxx einen Datensatz aus der Ergebnismenge liest, muss er aus dem Puffer des Servers gelesen werden.
Serverseitiger Modus ohne Cache
Client-Befehl: mysql_query(), legen Sie den Puffer in der SQL-Treibererweiterung (mysqlnd) des Clients fest wird verwendet, um die Ergebnismenge des Servers zwischenzuspeichern. Wenn also feth_array_xxx einen Datensatz aus der Ergebnismenge liest, wird die Zeile direkt aus dem erweiterten Mysqlnd-Puffer abgerufen.
Zusammenfassung
Wenn die Ergebnismenge sehr groß ist: Der serverseitige No-Cache-Modus kann den Speicherdruck auf dem Server verringern, belegt jedoch den Speicher auf dem Client. Es kommt einfach auf die Situation an.
PHP-Schicht zur Benutzerschicht
Auf der Clientseite ist die MySQL-Erweiterungs-Engine (libmysql oder mysqlnd) mit der Serverseite verbunden, und die Benutzerschicht ist über die Erweiterungsbibliothek (ext /mysql oder ext/mysqli) interagiert mit der MySQL-Engine (die Inspiration besteht darin, die API der Engine aufzurufen, um die Ergebnismenge zu lesen).
Die Mechanismen der Engines libmysql und mysqlnd sind unterschiedlich. Der Hauptunterschied besteht darin, dass mysqlnd in PHP geschrieben und in Zend kompiliert wird. Und libmysql ist eine allgemeine Bibliothek. Zend muss diese Bibliothek aufrufen, um die Datenbankverbindung zu realisieren. Aufgrund dieser Unterscheidung weisen MySQLnd und Zend eine bessere Haftung auf, und bei der Übertragung der Daten an die Benutzerebene gibt es eine Ebene weniger Datenkopien. Die spezifischen architektonischen Unterschiede sind in der folgenden Abbildung dargestellt. In der Abbildung stellt der fünfzackige Stern den Cache-Puffer dar.
ext/mysqli und ext/mysql sind Client-Erweiterungsbibliotheken (Bibliotheksfunktionen): Auf der Client-Skriptebene sind mysqlInd und libmysql MySQL-Server-Endtreiber . Unter diesen ist libmysql ein universeller MySQL-Abfragetreiber, während mysqlnd ein auf der Zend-Engine basierender SQL-Treiber ist, der speziell für PHP entwickelt wurde. Das heißt, die datengesteuerten Aktionen von mysqlnd erfordern eine Interaktion zwischen Zend und mysqlserver, während libmysql direkt mit mysqlserver interagiert.
Vergleich:
Der Prozess der Datenbankabfrage zwischen ext/mysqli (oder ext/mysql) und libmysql ist:
1) mysqi sendet eine Abfrageanforderung an den libmysql-Treiber
2) Libmysql Ausführungsanforderung Und holen Sie sich die Ergebnismenge in den Puffern der Speicherdomäne libmysql
3) Mysqli wendet für den Speicher an: einen durch zval angegebenen Puffer
4) Mysqii kopiert die Ergebnismenge von libmysql in den durch zval angegebenen Puffer
ext/mysqli (oder ext /mysql) und der mysqlnd-Datenbankabfrageprozess ist:
1) mysqi sendet eine Abfrageanforderung an den mysqlnd-Treiber
2) der mysqlnd-Treiber führt die SQL-Abfrage über die Zend-Engine aus, und jeder Zeile der Ergebnismenge wird in einem Puffer gespeichert (jeder Puffer ist verstreut)
3) Mysqlnd erstellt mehrere Zvals und zeigt auf diese Puffer
Zum Beispiel:
In ext/mysql & libmysql, Der libmysql-Treiber führt die SQL-Anweisung aus und ruft die Ergebnismenge Row1~ Row3 ab, dann kopiert ext/mysql die Ergebnismenge in den Zend-Puffer und dann liest die Funktion mysqli_fetch_xxx den Inhalt der Ergebnismenge aus dem Speicher in diesem Bereich.
In ext/mysqli und mysqlInd führt der mysqlnd-Treiber die SQL-Anweisung aus, um die Ergebnismenge Row1~Row3 zu erhalten, in der jede Zeile direkt von einem Puffer von zend gespeichert wird und auf den ein zval zeigt. Der Client liest die Ergebnisse direkt aus diesem Speicherbereich durch Mapping zur Implementierung von mysqli_fetch_xxx.
Zusammenfassung
MySQL und Zend sind im SQL-Abfragetreiber kohärenter. MySQL greift über die Zend-Engine auf die Datenbank zu und speichert die Ergebnisse direkt im Zend-Puffer von Zend), eine Kopie weniger des Ergebnismengencaches.
Referenz
"High Performance MySQL"
http://www.cnxct.com/libmysql-mysqlnd-which-is-best-and-what-about- mysqli-pdomysql-mysql/
http://www.cnxct.com/wp-content/uploads/2012/12/andrey-mysqlnd.pdf
Urheberrechtserklärung: Dieser Artikel wurde geschrieben vom Blogger (http://blog.csdn.net/ordeder) Originalartikel, darf nicht ohne Genehmigung des Bloggers reproduziert werden.
Das Obige gibt einen Überblick über den Datenabfrageprozess von PHP zu MySQL, einschließlich Aspekten des Prozesses. Ich hoffe, dass es für Freunde, die sich für MySQL interessieren, hilfreich sein wird.
Tipps für Computer/Mobiltelefone: Geteilte Dokumente abbrechen
Wenn Sie unter Windows XP „Arbeitsplatz“ öffnen, werden standardmäßig einige Ordner über dem Festplattensymbol angezeigt. Dies sind „freigegebene Ordner“, und hier sind alle Ordner aufgeführt, die von Benutzern zum Teilen von Dateien verwendet werden. Wir können diese Ordner von meinem Computer verschwinden lassen. Öffnen Sie einfach die Registrierung und suchen Sie den folgenden Speicherort: „Öffnen Sie mich“ beim nächsten Mal .Computer, diese lästigen Ordner existieren nicht mehr.
Das Obige hat einen Überblick über den PHP-zu-MySQL-Datenabfrageprozess gegeben, einschließlich verschiedener Aspekte. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.