Quelle que soit la légèreté de la requête, par exemple, s'il y a un RTT entre le serveur Web et MySQL pendant 5 ms et que 20 requêtes sont exécutées, le RTT seul prendra 100 ms.
La technique d'utilisation de l'insertion en bloc (une requête qui écrit plusieurs lignes après VALUES) lors de l'insertion d'un grand nombre de données est bien connue. Cependant, cette technique ne peut pas être utilisée dans les cas suivants.
Par exemple, il y a eu la scène suivante dans un certain cas de notre entreprise.
J'ai utilisé plusieurs déclarations et plusieurs ensembles de résultats pour accélérer ces situations.
Multiple Statements
Plusieurs requêtes peuvent être envoyées en une seule fois (un appel Cursor.execute () au niveau Python, un paquet COM_QUERY au niveau du protocole) séparés par ;. En connectant plusieurs instructions INSERT avec ;, vous pouvez accélérer un grand nombre d'instructions INSERT et d'instructions UPDATE.
Non seulement le RTT peut être réduit, mais le nombre de paquets TCP peut également être réduit, de sorte que l'on peut s'attendre à réduire la charge de la partie qui reçoit les requêtes côté serveur MySQL.
Cependant, ce mécanisme de concaténation de requêtes utilisant; est également souvent abusé dans l'injection SQL. Par conséquent, le protocole MySQL vous permet de désactiver plusieurs instructions lors d'une poignée de main. En fonction de la bibliothèque cliente MySQL, vous aurez peut-être besoin d'une option pour tirer parti de plusieurs instructions.
Par exemple, mysqlclient de Python a plusieurs instructions disponibles par défaut. (Pour une compatibilité descendante avec la bibliothèque d'origine de fork ...)
D'autre part, Go's github.com/go-sql-driver/mysql doit spécifier multiStatements = true
.
Une autre mise en garde est que les espaces réservés ne sont pas disponibles lors de l'utilisation de l'instruction préparée de MySQL (au niveau du protocole plutôt que l'instruction PREPARE). Vous devez l'échapper vous-même, assembler la chaîne SQL, puis lancer la requête ou la définir pour qu'elle n'utilise pas l'instruction préparée.
Multiple Result sets
Si vous souhaitez combiner plusieurs instructions SELECT, vous devez non seulement lancer plusieurs requêtes, mais également recevoir les résultats. Pour ce faire, utilisez plusieurs jeux de résultats.
Lorsque plusieurs jeux de résultats sont retournés, Python peut utiliser Cursor.nextset ()
pour recevoir le prochain jeu de résultats.
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
Pour Go, utilisez [Rows.NextResultSet ()] de database / sql
(https://golang.org/pkg/database/sql/#Rows.NextResultSet) pour recevoir plusieurs ensembles de résultats de la même manière. Je peux.
Recommended Posts