Heim > Backend-Entwicklung > PHP-Problem > Eine kurze Analyse, wie PHP + MySQL die Lese- und Schreibtrennung realisiert

Eine kurze Analyse, wie PHP + MySQL die Lese- und Schreibtrennung realisiert

PHPz
Freigeben: 2023-03-21 16:08:01
Original
1396 Leute haben es durchsucht

MySQL ist eine der beliebtesten Datenbanken und wird häufig in Anwendungen verwendet. Bei hoher Parallelität und großem Datenvolumen ist die Lese- und Schreibtrennung aufgrund der unzureichenden Lese- und Schreib-Parallelitätsleistung von MySQL zur Verbesserung der Parallelitätsleistung von MySQL zu einer notwendigen Lösung geworden.

Das Prinzip der Lese- und Schreibtrennung besteht darin, Lesevorgänge und Schreibvorgänge auf verschiedenen MySQL-Instanzen zu platzieren, sodass die Last von Lesevorgängen und Schreibvorgängen jeweils von verschiedenen MySQL-Instanzen getragen werden kann, wodurch der Zweck einer Verbesserung der Datenbankleistung erreicht wird.

PHP ist als beliebte dynamische Sprache sehr eng mit MySQL integriert. In diesem Artikel wird daher erläutert, wie Sie mithilfe von PHP eine MySQL-Lese- und Schreibtrennung erreichen.

PHP implementiert die MySQL-Lese-Schreib-Trennung und muss die folgenden Funktionen implementieren:

1 Unterscheiden Sie Lese- und Schreibvorgänge: Im PHP-Code müssen Datenbankvorgänge unterschieden werden, und Lesevorgänge und Schreibvorgänge werden unterschiedlich platziert MySQL-Instanzen.

2. Lastausgleichsstrategie: Es ist notwendig, eine Lastausgleichsstrategie zu implementieren, um Leseanforderungen gemäß unterschiedlichen Algorithmen gleichmäßig auf verschiedene MySQL-Instanzen zu verteilen.

Im Folgenden stellen wir detailliert vor, wie die oben genannten Funktionen implementiert werden.

Unterscheiden Sie zwischen Lese- und Schreibvorgängen

Die Implementierung der Lese- und Schreibtrennung von MySQL erfordert die Unterstützung der MySQL-Master-Slave-Replikationstechnologie. Bei der MySQL-Master-Slave-Replikation werden alle Schreibvorgänge an die Master-Datenbank gesendet, während die Slave-Datenbank nur Lesevorgänge ausführt.

Im PHP-Code müssen MySQL-Lese- und Schreibvorgänge unterschieden werden. Schreibvorgänge werden an die Hauptbibliothek gesendet, während Lesevorgänge an die Slave-Bibliothek gesendet werden.

Die folgenden zwei Methoden können für die spezifische Implementierung verwendet werden:

1. Manuelle Schaltverbindung: Schaltverbindungen für Lese- und Schreibvorgänge manuell im Code implementieren. Stellen Sie eine Verbindung zur Hauptdatenbank bzw. zur Slave-Datenbank her und führen Sie bei Bedarf entsprechende SQL-Anweisungen auf verschiedenen verbundenen MySQL-Instanzen aus.

Zum Beispiel für die folgende SQL-Anweisung:

SELECT * FROM users WHERE age>18;
Nach dem Login kopieren

Der folgende Code kann verwendet werden, um die Schaltverbindung für den Lesevorgang zu implementieren:

//生成一个读取从库的连接
$slaveConn = mysqli_connect($slaveHost, $slaveUser, $slavePass, $dbName);
mysqli_query($slaveConn, "SET NAMES utf8");

//查询数据
$result = mysqli_query($slaveConn, "SELECT * FROM users WHERE age>18");
Nach dem Login kopieren

Ebenso kann für den Schreibvorgang:

INSERT INTO users (name,age,sex) VALUES ('jack',18,'male');
Nach dem Login kopieren

Der folgende Code verwendet werden Implementieren Sie die Schaltverbindung für den Schreibvorgang:

//生成一个写入主库的连接
$masterConn = mysqli_connect($masterHost, $masterUser, $masterPass, $dbName);
mysqli_query($masterConn, "SET NAMES utf8");

//插入数据
$result = mysqli_query($masterConn, "INSERT INTO users (name,age,sex) VALUES ('jack',18,'male')");
Nach dem Login kopieren

Im obigen Code wird die Funktion mysqli_connect zum Generieren einer Datenbankverbindung und die Methode mysqli_query zum Betreiben der MySQL-Datenbank verwendet. Darunter sind $slaveHost, $slaveUser und $slavePass die Verbindungsinformationen der Slave-Bibliothek und $masterHost, $masterUser und $masterPass die Verbindungsinformationen der Master-Bibliothek.

2. Verwenden Sie das Framework: Im PHP-Framework können Sie die integrierte Implementierung des Frameworks verwenden, um zwischen Lese- und Schreibvorgängen zu wechseln. Im Yii2-Framework können Sie beispielsweise den folgenden Code verwenden, um zwischen Lese- und Schreibvorgängen zu wechseln:

//生成一个读取从库的连接
$slaveConn = Yii::$app->slaveDb->getConnection();

//查询数据
$query = new \yii\db\Query();
$result = $query->from('users')->where(['age' > 18])->all($slaveConn);
Nach dem Login kopieren

Ähnlich können Sie den folgenden Code verwenden, um zwischen Schreibvorgängen zu wechseln:

//生成一个写入主库的连接
$masterConn = Yii::$app->masterDb->getConnection();

//插入数据
$result = Yii::$app->db->createCommand()->insert('users', [
'name' => 'jack',
'age' => 18,
'sex' => 'male'
])->execute($masterConn);
Nach dem Login kopieren

Im obigen Code lautet Yii::$app ->slaveDb und Yii ::$app->masterDb sind integrierte Datenbankverbindungskomponenten des Yii2-Frameworks und stellen Methoden zum Lesen aus der Slave-Bibliothek und zum Schreiben in die Master-Bibliothek bereit.

Lastausgleichsstrategie

Für die Implementierung der MySQL-Lese- und Schreibtrennung ist der Lastausgleich ein sehr wichtiger Teil. Nur wenn alle Leseanfragen gleichmäßig auf jede Slave-Datenbank verteilt werden, können die Vorteile der MySQL-Lese- und Schreibtrennung voll ausgenutzt werden.

Zu den häufig verwendeten Lastausgleichsstrategien gehören:

1. Zufällige Strategie: Leseanforderungen zufällig an jede Slave-Datenbank verteilen.

2. Polling-Strategie: Leseanfragen nacheinander jeder Slave-Bibliothek zuweisen und zyklisch verwenden.

3. Verfügbarkeitsprioritätsstrategie: Verwenden Sie eine Verfügbarkeitsüberwachungsmethode, um verfügbare Slave-Bibliotheken vor Lesevorgängen auszuwählen.

Dieser Artikel verwendet eine Abfragestrategie und die spezifische Implementierung ist wie folgt:

//从库连接信息
$slave1 = array(
'host' => 'slave1.host.com', 
'user' => 'slave1user', 
'pass' => 'slave1pass',
'name' => 'dbname'
);

$slave2 = array(
'host' => 'slave2.host.com', 
'user' => 'slave2user', 
'pass' => 'slave2pass',
'name' => 'dbname'
);

$slave3 = array(
'host' => 'slave3.host.com', 
'user' => 'slave3user', 
'pass' => 'slave3pass',
'name' => 'dbname'
);


//增加从库列表
$slaveList = array($slave1, $slave2, $slave3);


//轮询获取从库连接信息
function getSlaveConn() {
global $slaveList;
static $index = 0;
if ($index >= count($slaveList)) {
    $index = 0;
}
$slave = $slaveList[$index];
$index++;
$conn = mysqli_connect($slave['host'], $slave['user'], $slave['pass'], $slave['name']);
mysqli_query($conn, "SET NAMES utf8");
return $conn;
}
Nach dem Login kopieren

Im obigen Code sind $slave1, $slave2, $slave3 Verbindungsinformationen der Slave-Bibliothek und $slaveList die Liste der Slave-Bibliotheken. In der Funktion getSlaveConn ist $index die Anzahl der Verbindungen zur Slave-Bibliothek. Wenn die Anzahl der Verbindungen der Länge der Slave-Bibliotheksliste entspricht, wird $index auf Null zurückgesetzt und die Verbindung wird von der ersten Slave-Bibliothek aus erneut hergestellt. Verwenden Sie jedes Mal, wenn Sie eine Verbindung herstellen, die Funktion mysqli_connect, um eine Datenbankverbindung zu erstellen und eine Verbindung zu einer Slave-Datenbank herzustellen.

Durch die obige Implementierung wurde die PHP-Funktion zur Realisierung der MySQL-Lese- und Schreibtrennung implementiert. Sie können den obigen Code verwenden, um die MySQL-Lese-Schreib-Trennfunktion in PHP-Anwendungen zu implementieren und nach Bedarf Lastausgleichsstrategien hinzuzufügen oder zu ändern.

Bei hoher Parallelität und großem Datenvolumen kann die Verwendung von PHP zum Trennen von MySQL-Lesen und -Schreiben die Lese- und Schreibleistung der MySQL-Datenbank effektiv verbessern, die Reaktionszeit der Anwendung verkürzen und das Benutzererlebnis verbessern.

Das obige ist der detaillierte Inhalt vonEine kurze Analyse, wie PHP + MySQL die Lese- und Schreibtrennung realisiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage