MySQL-Abfrage bietet auch eine weitere Abfragemethode. Der Funktionsname lautet mysql_unbuffered_query. Diese Funktion verwendet die Ergebnismenge unmittelbar nach dem Finden des Ergebnisses und speichert sie nicht im Speicher, wodurch eine Speicherüberschreitung vermieden wird . Der Preis für die Verwendung dieser Methode besteht jedoch darin, dass Sie bei der Abfrage keine Methoden wie das Abrufen des Hauptsitzes verwenden können, da diese Methode bei der Abfrage Ergebnisse zurückgibt. Gleichzeitig können Sie bei Verwendung dieser Methode keine anderen Vorgänge auf derselben Datenbankverbindung ausführen. Wenn Sie andere Vorgänge ausführen möchten, müssen Sie zunächst den aktuellen Vorgang beenden, alle durch nicht zwischengespeicherte SQL-Abfragen generierten Ergebniszeilen freigeben oder eine erneute Instanziierung durchführen Eine Datenbank verbinden und den neuen Link für andere Aktionen verwenden.
Das Folgende ist ein Vergleich zwischen der Verwendung des Caches und der Nichtverwendung des Caches (die abgefragte Tabelle enthält mehr als 10 Millionen Datenzeilen):
function selecttest() { try { $pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456'); // 不使用缓存结果集方式 // $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); $sth = $pdo->prepare('select * from test'); $sth->execute(); echo '最初占用内存大小:' . memory_get_usage() . "\n"; $i = 0; while ($result = $sth->fetch(PDO::FETCH_ASSOC)) { $i += 1; if ($i > 10) { break; } sleep(1); print_r($result); echo '占用内存大小:' . memory_get_usage() . "\n"; } } catch (Exception $e) { echo $e->getMessage(); } }
Das Obige gilt Alle Ergebnisse zwischenspeichern. Beim Ausführen dieser Funktion wird ein übermäßiger Speicherfehler gemeldet, wie unten gezeigt:
Schwerwiegender Fehler: Zulässige Speichergröße von 134217728 Bytes erschöpft (versucht, 204800000 Bytes zuzuweisen) in E:ProgramDevelopmentRuntimeEnvironmentxampphtdocstesttest .php in Zeile 57
Call Stack:
0.0005 135392 1. {main}() E:ProgramDevelopmentRuntimeEnvironmentxampphtdocstesttest.php:0
0.0005. 1 35568 2. Test-> süß (); Speicherlimit;
Entfernen Sie den Kommentar // $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY); und diese Zeile verwendet die Methode, die Ergebnismenge nicht zwischenzuspeichern Diese Funktion gibt den folgenden Inhalt aus:
Anfänglich belegte Speichergröße: 144808
Belegte Speichergröße: 145544
Array ( [id] => 1 [a] => v [b] => w [c] => i )
Belegte Speichergröße: 145544
Array ( [id] => 2 [a] => b [b] => l [c] => q )
Speichergröße belegt: 145536
Array ( [id] => 3 [a] => m [b] => p [c] => h )
Speichergröße belegt: 145536
Array ( [id] => 4 [a] => j [b] => i [c] => b )
Speichergröße belegt: 145536
Array ( [id] => 5 [a] => q [b] => g [c] => g )