Le [MySQL Casual Advent Calendar 2017] d'hier (https://qiita.com/advent-calendar/2017/mysql-casual) était [Introduction to Window Functions for MySQL] de @ tikamoto (https://qiita.com) / tikamoto / items / a9298442ba0ef45112fe).
Cet article est une continuation de Advent Calender Day 10 Benching en changeant les propriétés avec MySQL Connector / J Partie 1: Batch Edition.
La dernière fois, j'ai dit "changer les propriétés ici et là" mais n'en ai changé qu'une, c'est donc la "production" réelle.
En plus des commandes de requête envoyées par l'utilisateur, MySQL Connector / J parle souvent comme «SELECT @@…» et «SET…», mais il essaie d'éviter de gaspiller autant que possible. Est le thème de cette vérification.
Pour le code de vérification et la définition de la base de données, ceux de Précédent seront utilisés.
De
Spécification de l'encodage characterEncoding
* Élément de non-performance
characterSetResults
Spécification de codage pour l'ensemble de résultats * Identique à ci-dessus
ʻAlwaysSendSetIsolationToujours envoyer le niveau d'isolement de transaction (**
true **) / not (
false`)
ʻElideSetAutoCommits`` SET autocommit = nuniquement lorsque l'état est différent du côté serveur
SET autocommit = n Envoyer (
true) / Toujours envoyer (**
false` **)
ʻUseLocalSessionState Juger le niveau d'isolement de la transaction de validation automatique sans demander au serveur (
true) / not (**
false` **)
cacheServerConfiguration
Paramètres du serveur de cache ( true
) / not (** false
**)
** Bold
** est la valeur par défaut
Pour examiner la modification des performances lors de la modification de la valeur par défaut
Les articles suivants seront utiles.
** Celui qui semble fonctionner avec les paramètres de mysql Connector / J M.) **
Cependant, il est difficile d'essayer toutes les combinaisons, donc
rewriteBatchedStatements = true
rewriteBatchedStatements = true
rewriteBatchedStatements = true
, tous les éléments de transaction autocommit sont modifiés (dans le sens d'un trafic réduit)rewriteBatchedStatements = true
Nous vérifierons avec 4 modèles.
1000 lignes /
COMMIT` 10 000 lignes.Le résultat de la vérification du temps requis et du nombre de requêtes / commandes est affiché.
Modèle de vérification | Temps de lot requis(ms) | Durée hors lot(ms) |
---|---|---|
rewriteBatchedStatements=true seulement |
11,691 | 50,299 |
rewriteBatchedStatements=true + Encodage |
12,173 | 51,042 |
rewriteBatchedStatements=true +SET autocommit Suppression égale |
11,334 | 31,277 |
rewriteBatchedStatements=true + Cache des paramètres du serveur |
11,911 | 52,384 |
Seule la durée non par lots du troisième modèle ** "Modifier tous les éléments de transaction autocommit en plus de rewriteBatchedStatements = true
" ** a eu un effet clair.
D'autres sont dans la plage d'erreur.
J'ai essayé d'agréger le "journal des requêtes lentes de 0 seconde".
rewriteBatchedStatements=vrai seulement
root@localhost [(none)] > SELECT LEFT(sql_text, 80) sqltext, COUNT(*) cnt FROM mysql.slow_log GROUP BY sql_text ORDER BY cnt DESC;
+----------------------------------------------------------------------------------+-------+
| sqltext | cnt |
+----------------------------------------------------------------------------------+-------+
| select @@session.tx_read_only | 59232 |
| INSERT INTO insert_test.insert_test (memo) VALUES ('1234567890123456 | 20151 |
| INSERT INTO insert_test.insert_test (memo) VALUES ('1234567890123456 | 400 |
| commit | 120 |
| /* mysql-connector-java-5.1.44 ( Revision: b3cda4f864902ffdde495b9df93937c3e2000 | 3 |
| SET autocommit=1 | 1 |
| SET autocommit=0 | 1 |
| rollback | 1 |
+----------------------------------------------------------------------------------+-------+
8 rows in set (18.27 sec)
rewriteBatchedStatements=vrai + encodage
root@localhost [(none)] > SELECT LEFT(sql_text, 80) sqltext, COUNT(*) cnt FROM mysql.slow_log GROUP BY sql_text ORDER BY cnt DESC;
+----------------------------------------------------------------------------------+-------+
| sqltext | cnt |
+----------------------------------------------------------------------------------+-------+
| select @@session.tx_read_only | 60793 |
| INSERT INTO insert_test.insert_test (memo) VALUES ('1234567890123456 | 20680 |
| INSERT INTO insert_test.insert_test (memo) VALUES ('1234567890123456 | 400 |
| commit | 120 |
| SET autocommit=0 | 3 |
| /* mysql-connector-java-5.1.44 ( Revision: b3cda4f864902ffdde495b9df93937c3e2000 | 2 |
| Quit | 2 |
| SET NAMES utf8 | 1 |
| SET autocommit=1 | 1 |
| select @@version_comment limit 1 | 1 |
+----------------------------------------------------------------------------------+-------+
10 rows in set (18.85 sec)
rewriteBatchedStatements=true+SET_Suppression telle que la validation automatique
root@localhost [(none)] > SELECT LEFT(sql_text, 80) sqltext, COUNT(*) cnt FROM mysql.slow_log GROUP BY sql_text ORDER BY cnt DESC;
+----------------------------------------------------------------------------------+-------+
| sqltext | cnt |
+----------------------------------------------------------------------------------+-------+
| INSERT INTO insert_test.insert_test (memo) VALUES ('1234567890123456 | 21179 |
| INSERT INTO insert_test.insert_test (memo) VALUES ('1234567890123456 | 400 |
| commit | 120 |
| /* mysql-connector-java-5.1.44 ( Revision: b3cda4f864902ffdde495b9df93937c3e2000 | 3 |
| SET character_set_results = NULL | 1 |
| rollback | 1 |
| select @@version_comment limit 1 | 1 |
| select USER() | 1 |
+----------------------------------------------------------------------------------+-------+
8 rows in set (3.00 sec)
rewriteBatchedStatements=vrai + cache des paramètres du serveur
root@localhost [(none)] > SELECT LEFT(sql_text, 80) sqltext, COUNT(*) cnt FROM mysql.slow_log GROUP BY sql_text ORDER BY cnt DESC;
+----------------------------------------------------------------------------------+-------+
| sqltext | cnt |
+----------------------------------------------------------------------------------+-------+
| select @@session.tx_read_only | 60414 |
| INSERT INTO insert_test.insert_test (memo) VALUES ('1234567890123456 | 20353 |
| INSERT INTO insert_test.insert_test (memo) VALUES ('1234567890123456 | 400 |
| commit | 120 |
| SET autocommit=0 | 1 |
| SET character_set_results = NULL | 1 |
| Quit | 1 |
| rollback | 1 |
+----------------------------------------------------------------------------------+-------+
8 rows in set (18.50 sec)
Il y a deux ʻINSERT INTO, le haut est ʻINSERT
(non-batch) avec une ligne chacun, et le bas est ʻINSERT (batch) avec plusieurs lignes. Le nombre d'exécutions du premier n'était pas exactement de 20 000, mais le nombre de lignes ʻINSERT
était normal (1,2 million de lignes au total).
Il semble y avoir du bruit dans chaque résultat, et le résultat changera s'il s'agit d'une vérification qui exécute SQL pendant une longue période, mais l'effet peut être clairement vu dans le troisième modèle.
D'un autre côté, le 4ème modèle n'a pas produit les résultats escomptés, mais le nombre de demandes d'informations sur les paramètres du serveur (/ * mysql-connector-java-5.1.44…
) dans les autres modèles est petit en premier lieu. Dans cet esprit, il est possible que le test n'ait pas été efficace car il s'agissait d'un test qui a vidé SQL en peu de temps.
Les résultats étaient surprenants pour le cache du serveur, mais sinon, comme prévu, sceller le «discours» semble avoir un impact sur les performances. Toutefois, l'utilisation du regroupement de connexions peut modifier les résultats et si vous êtes dans un cluster, des problèmes peuvent survenir pendant le basculement en fonction du contenu spécifié.
Je viens de te dire ça, et cette fois c'est fini.
Dans le prochain article (21/12) (https://qiita.com/hmatsu47/items/d3ce39577fb383ec21d2), nous examinerons la fonction de mise en cache des instructions préparées.
Le [MySQL Casual Advent Calendar 2017] de demain (https://qiita.com/advent-calendar/2017/mysql-casual) sera le [Easy Access to NDB Cluster with Memcached] de @ bringer1092 (https: // qiita. C'est com / bringer1092 / items / dc16da138826134a0ff9).