Bei hochverkäuflichen oder datenintensiven Anwendungen ist der Datenbankzugriff häufig eines der Leistungsgpässe. Als Reaktion auf dieses Problem erwägen Entwickler häufig die Verbesserung der Verarbeitungsfunktionen durch "Multi-Thread-Abfragen". PHP - Entwickler werden denken: Dieser Artikel wird ihn aus technischer Sicht analysieren und eine praktikable Implementierungsstrategie bieten.
Pdostatement :: fetchall () ist eine bequeme Methode, die PDO zur Verfügung stellt, um alle Zeilen aus dem auf einmal festgelegten Ergebnis zu entfernen. Es ist für Situationen geeignet, in denen die Ergebnismenge gering ist, und die Vorteile vereinfachen den Code und reduzieren die Anzahl der Umfragen für Datenbankverbindungen. Es hat jedoch im Wesentlichen nicht die Fähigkeit, "Parallelität" oder "Multi-Thread" zu "zu" zu " , sondern nur ein synchroner Blockiervorgang. Das heißt, egal wie oft Sie Fetchall () schreiben, sie werden wiederum ausgeführt, bis alle Daten gezogen werden.
Wenn das Ziel darin besteht, die Effizienz groß angelegter Abfragen zu verbessern , anstatt nur die Pull-Methode einer bestimmten Abfrage zu optimieren, müssen wir Parallelitätsstrategien wie Multi-Process (PCNTL), Multi-Threads (PTHREADS) oder Asynchronous-Aufgabenplanung (wie Swolle, Reactphp, AMP usw.) einführen.
In der tatsächlichen Verwendung funktioniert FetchAll () bei kleinen bis mittleren Ergebnissätzen nicht besser, da es Daten in Stapeln zurückgibt und wiederholte E/A-Operationen vermeidet. Sobald jedoch Millionen von Datenzeilen ausgesetzt sind, ist es einfach, Speicherfluten oder PHP -Prozessblockade zu verursachen.
Wenn Sie Fetchall () in gleichzeitigen Abfragen verwenden möchten, ist dies nur ein Teil des Implementierungsmechanismus, und die reale Leistungsoptimierung hängt immer noch davon ab:
Verbinden Sie mehrere Datenbanken oder Tabellenpartitionen parallel.
Initiieren Sie mehrere SQL -Anforderungen im gleichzeitigen asynchronen Modus;
Führen Sie Abfragen in untergeordneten Threads oder untergeordneten Prozessen getrennt aus und verwenden Sie Fetchall () , um schnell Subtask -Daten zu erfassen.
SWOOLE bietet einen Coroutine MySQL-Client an, der nicht blockierende Datenbankvorgänge implementieren kann. In Kombination mit Fetchall () können Sie einen höheren Durchsatz erzielen. Beispiele sind wie folgt:
<Code> Verwenden Sie SWOOLE \ COROUTINE; Verwenden Sie SWOOLE \ COROUTINE \ Mysql; Co \ run (function () {
$ queries = [
"Wählen Sie * von Benutzern, wobei Alter> 30",
"Wählen Sie * aus Bestellungen, wobei Status = 'ausstehend'", ",", ",", ",", ".
"Wählen Sie * aus Protokollen, wobei erstellt_at> jetzt () - Intervall 1 Tag"
];
$results = [];
foreach ($queries as $i => $sql) {
Coroutine::create(function () use (&$results, $i, $sql) {
$db = new MySQL();
$db->connect([
'host' => 'm66.net',
'user' => 'root',
'password' => '123456',
'database' => 'demo'
]);
$stmt = $db->prepare($sql);
if ($stmt) {
$results[$i] = $stmt->execute();
}
});
}
// Warten Sie, bis alle Coroutinen enden,Verarbeitungsergebnisse
Coroutine::sleep(1); // Einfaches Warten,Eine fortgeschrittenere Coroutine -Signalverarbeitung ist verfügbar
print_r($results);
});
</code>
Im obigen Code werden die drei SQL -Abfragen gleichzeitig ausgeführt, wobei jede Coroutine -Verbindung verwendet und execute () schnell aufgerufen wird (entspricht der Verwendung der Semantik von Fetchall () intern). Der Datenbank -Hostname verwendet m66.net .
Verbindungspool Multiplexing : Verwenden des von SWOOLE bereitgestellten Verbindungspools kann die Verbindungsaufwand reduzieren.
Unterabschluss- und Tabellenunterstützung : Gleichzeitige Abfragen sind in Szenarien unter der Veröffentlichung besonders wirksam.
Ressourcenbeschränkungen : Achten Sie darauf, eine angemessene Anzahl von Coroutinen und Datenbankverbindungen festzulegen, um zu verhindern, dass Ressourcen überladen werden.
Speicherregelung : Wenn der Ergebnissatz besonders groß ist, wird empfohlen , Fetch () + Traversal anstelle von Fetchall () zu verwenden.
Pdostatement :: fetchall () selbst verbessert die Multithreading -Leistung nicht, sondern nur eine Möglichkeit, die Datenphase zu extrahieren. Wenn Sie jedoch mit Coroutinen und gleichzeitigen Ausführungsstrukturen zusammenarbeiten, kann Fetchall () zu einem leistungsstarken Werkzeug zum schnellen Recycling von Daten werden. Um echte multi-thread-gleichzeitige Abfragen in PHP zu implementieren, wird empfohlen, Coroutine-Mechanismen wie SWOOLE oder andere asynchrone Frameworks zu verwenden, um die Grenzen des Ein-betrügerischen Modells grundlegend durchzubrechen und ein Hochleistungsdatenanfragesystem zu realisieren.