Unabhängig davon, wie leicht die Abfrage ist, wenn beispielsweise zwischen dem Webserver und MySQL eine RTT für 5 ms besteht und 20 Abfragen ausgeführt werden, dauert die RTT allein 100 ms.
Die Technik der Verwendung von Masseneinfügungen (eine Abfrage, die mehrere Zeilen nach VALUES schreibt) beim Einfügen vieler Daten ist allgemein bekannt. Diese Technik kann jedoch in den folgenden Fällen nicht verwendet werden.
Zum Beispiel gab es in einem bestimmten Fall unseres Unternehmens die folgende Szene.
Ich habe mehrere Anweisungen und mehrere Ergebnismengen verwendet, um diese Situationen zu beschleunigen.
Multiple Statements
Es können mehrere Abfragen in einem Schuss gesendet werden (ein Aufruf von Cursor.execute () auf Python-Ebene, ein COM_QUERY-Paket auf Protokollebene), getrennt durch;. Durch Verbinden mehrerer INSERT-Anweisungen mit; können Sie eine große Anzahl von INSERT-Anweisungen und UPDATE-Anweisungen beschleunigen.
RTT kann nicht nur reduziert werden, sondern auch die Anzahl der TCP-Pakete. Es ist daher zu erwarten, dass die Belastung des Teils, der Abfragen auf der MySQL-Serverseite empfängt, verringert wird.
Multiple Result sets
import MySQLdb
con = MySQLdb.connect(host="127.0.0.1", port=3306, user="test", password="test")
cur = con.cursor()
q = """\
select 1;
select 2;
select 3;
select 4;
select 5;
"""
cur.execute(q)
while True:
print(cur.fetchall())
if not cur.nextset():
break
In Pythons mysqlclient stehen beispielsweise standardmäßig mehrere Anweisungen zur Verfügung. (Aus Gründen der Abwärtskompatibilität mit der alten Fork-Bibliothek ...) In der Zwischenzeit ist Go's github.com/go-sql-driver/mysql mysql) muss "multiStatements = true" angeben. Eine weitere Einschränkung ist, dass Platzhalter nicht verfügbar sind, wenn die vorbereitete Anweisung von MySQL verwendet wird (Protokollebene anstelle der Anweisung PREPARE). Sie müssen es selbst maskieren, die SQL-Zeichenfolge zusammenstellen und dann die Abfrage auslösen oder festlegen, dass die vorbereitete Anweisung nicht verwendet wird. Wenn Sie mehrere SELECT-Anweisungen kombinieren möchten, müssen Sie nicht nur mehrere Abfragen auslösen, sondern auch die Ergebnisse erhalten. Verwenden Sie dazu mehrere Ergebnismengen. Wenn mehrere Ergebnismengen zurückgegeben werden, kann Python "Cursor.nextset ()" verwenden, um die nächste Ergebnismenge zu erhalten. Verwenden Sie im Fall von Go Rows.NextResultSet () von database / sql
, um mehrere Ergebnissätze auf dieselbe Weise zu empfangen. Ich kann.
Recommended Posts