Cette question peut probablement être posée sur Stackoverflow aussi, mais je vais essayer ici d'abord ...
La performance des instructions d'insertion et de mise à jour dans notre base de données semble être dégradante et causer de mauvaises performances dans notre application Web.
Les tables sont InnoDB et l'application utilise des transactions. Y a-t-il des modifications faciles que je peux faire pour accélérer les choses?
Je pense que nous pourrions voir certains problèmes de verrouillage, comment puis-je savoir?
Vérifiez si votre matériel et votre système d'exploitation sont correctement configurés et adaptés:
Vérifiez si votre instance MySQL/InnoDB est correctement accordée:
Load data infile
Est beaucoup plus rapide pour une série d'inserts.select count(*) from table;
est beaucoup plus lent pour InnoDB que pour Myisam.Dans notre environnement, nous avons eu une situation, qu'un type de requêtes de mise à jour était lent. Le temps estimé pour terminer le travail de lot était de 2 jours !!! Après avoir analysé le journal de slowquery, nous trouvons que ce type de requête de mise à jour a besoin de 4 secondes à compléter. La requête ressemblait à ceci:
update table1 set field1=value1 where table1.field2=xx table2.field3=yy and table2.field4=zz
. Après avoir converti la requête de mise à jour pour sélectionner la requête et exécuter Expliquez sur cette requête Sélectionner que nous trouvons, que ce type de requête n'utilise pas d'index. Après avoir créé un indice approprié, nous avions réduit le temps d'exécution de la requête de mise à jour des militants et que l'ensemble du travail est terminé en moins de deux heures.
Quelques liens utiles:
Avec la configuration InnoDB par défaut, vous serez limité à la rapidité avec laquelle vous pouvez écrire et flush transactions sur disque. Si vous pouvez gérer la perte d'un peu d'acide, expérimentez-vous avec innodb_flush_log_at_trx_commit. Réglez sur 0 pour écrire et affleurez le journal sur le disque environ chaque seconde. Définissez sur 1 (par défaut) pour écrire et affleurer chaque commit. Définissez sur 2 pour écrire sur le fichier journal après chaque engagement, mais ne s'allume qu'une fois par seconde.
Si vous pouvez faire face à la perte de 1 de transactions, cela peut être un excellent moyen d'améliorer considérablement les performances de l'écriture.
En outre, faites attention à ce que font vos disques. RAID 10> RAID 5 pour écrit au coût d'un disque supplémentaire.
L'allumage des moniteurs Innodb peut aider à identifier les causes des serrures et des blocages:
Les problèmes de verrouillage seront examinés par les statuts de connexion en show full processlist;
Lire à travers le my.cnf
et mySQL documentation. Les options de configuration sont très bien documentées.
De manière générale, vous voulez autant que possible de traiter dans la mémoire. Pour l'optimisation des requêtes, cela signifie éviter les tables temporaires. Application appropriée d'index.
Le réglage va être spécifique à votre moteur de base de données préféré et à votre architecture d'application. Il existe des ressources substantielles préexistantes une recherche sur Internet.
Comment puis-je résoudre les problèmes de performance d'insertion et de mise à jour dans MySQL dans l'application Web juste en désactivant les changements de commit et de validation automatique une fois en Java. Comme suggéré dans la documentation MySQL.
Innodb est un joli bon moteur. Cependant, il s'appuie fortement sur "à l'écoute". Une chose est que si vos insertions ne sont pas dans l'ordre d'augmentation des clés primaires, InnoDB peut prendre un peu plus longtemps que Myisam. Ceci peut facilement être surmonté en définissant un Innodb_Buffer_Pool_Size_Pool_SIZE_POOL_SIZE_POOL_SIZE. Ma suggestion est de la définir à 60-70% de votre RAM totale. Je suis en train de faire 4 serveurs de tels serveurs en production, insérant environ 3,5 millions de rangées par minute. Ils ont déjà près de 3 téraoctets. InnoDB Il fallait être, à cause des inserts très concurrents. Il y a d'autres moyens d'accélérer les inserts. Et j'ai comparu certains.