[PYTHON] Accélérez un grand nombre de requêtes simples dans MySQL

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

Accélérez un grand nombre de requêtes simples dans MySQL
Connectez un grand nombre de vidéos ensemble!
Téléchargez un grand nombre d'images sur Wordpress
Organisez un grand nombre de fichiers dans des dossiers
[Python] Générer de manière aléatoire un grand nombre de noms de personne en anglais
Consolider un grand nombre de fichiers CSV dans des dossiers avec python (données sans en-tête)
Un outil pour suivre les affiches avec un grand nombre de likes sur instagram [25 minutes à 1 seconde]
Un simple exemple de pivot_table.
Scrapy-Redis est recommandé pour l'exploration d'un grand nombre de domaines
Lambda + Python est efficace pour restreindre l'accès à un grand nombre de listes d'adresses IP
L'exécution d'un grand nombre de Python3 Executor.submit peut consommer beaucoup de mémoire.
Rubyist a essayé de créer une API simple avec Python + bouteille + MySQL
Mise en place d'un filtre à particules simple
TensorFlow Pour apprendre d'un grand nombre d'images ... ~ (presque) solution ~
Convertissez un grand nombre de fichiers PDF en fichiers texte à l'aide de pdfminer
Comment créer une grande quantité de données de test dans MySQL? ??
Je souhaite résoudre le problème de fuite de mémoire lors de la sortie d'un grand nombre d'images avec Matplotlib
Utilisez shutil pour supprimer tous les dossiers avec un petit nombre de fichiers
Traitement ETL pour un grand nombre de fichiers GTFS Realtime (édition Python)
Générez une liste contenant le nombre de jours du mois en cours.
TensorFlow Pour apprendre d'un grand nombre d'images ... (Problème non résolu) → 12/18 Résolu
Créer un fichier power simple avec Python
Nombre moyen maximum de visiteurs quotidiens (grand)
Lecteur RSS simple réalisé avec Django
Créer un gros fichier texte avec shellscript
Faisons un langage simple avec PLY 1
Créez une application Web simple avec Flask
Développez n'importe quel nombre d'arguments avec yasnippet
Pandas: un exemple très simple de DataFrame.rolling ()
J'ai fait un simple blackjack avec Python
Compter le nombre de caractères avec écho
One-liner qui crée un grand nombre de fichiers de test à la fois sous Linux
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
Découvrez comment diviser uniformément un fichier avec un certain nombre de lignes
[AtCoder] Résoudre un problème de ABC101 ~ 169 avec Python
Configurer un serveur HTTPS simple avec asyncio
Convertissez les données avec la forme (nombre de données, 1) en (nombre de données,) avec numpy.
Créez un simple générateur d'images par points avec Flask
Calculez le nombre total de combinaisons avec python
Démarrez un serveur Web Python simple avec Docker
Trouvez le nombre de jours dans un mois
Résolvez A ~ D du codeur yuki 247 avec python
J'ai fait un simple portefeuille de Bitcoin avec pycoin
Obtenir une liste d'utilisateurs IAM avec Boto3
Automatiser des tâches simples avec Python Table des matières
Flux de création d'un environnement virtuel avec Anaconda
Liste de tâches simple créée avec Python + Django
J'ai fait un graphique de nombres aléatoires avec Numpy
Créer une table avec le notebook IPython
Obtenez une grande quantité de données Twitter de Starba avec python et essayez l'analyse de données Partie 1
Un script qui combine les marges lors du collage d'un certain nombre de graphiques sur des tuiles avec gnuplot
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
[Art de la coquille] Seulement quand c'est un multiple de 3 et un nombre avec 3 devient stupide
Utilisez l'API pour modifier collectivement un grand nombre d'e-mails non lus dans Gmail à lire