web-dev-qa-db-fra.com

Comment améliorer les performances d'insertion et de mise à jour de MySQL?

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?

14
mmattax
  1. Vérifiez si votre matériel et votre système d'exploitation sont correctement configurés et adaptés:

    • Source de problème (CPU/Io/Memory/Usage de swap). Avez-vous beaucoup d'iop? Les CPU sont-ils chargés? Si vous avez beaucoup de lecture d'IOP, vous n'avez probablement pas assez de gros buffer_pool InnoDB. Si la CPU est chargée probablement, vos requêtes font des analyses de table complètes au lieu d'utiliser des index appropriés.
    • Configuration du disque/RAID/LVM. Dans certaines configurations spécifiques , la bande LVM pourrait vous donner profit d'une charge de disque éponalisation (sans raid matériel, plusieurs LUN connectées)
    • Scheduler Io: Lorsque vous avez un bon contrôleur de raid matériel, probablement noop est le meilleur. Redhat a fait des tests et ils ont dit que pour Oracle (et d'autres dB) CFQ est le meilleur choix. Vous devez exécuter des points de repère (comme TPC-C ou TPC-E) et choisir, quel est le meilleur pour votre matériel.
    • Bon fichier de fichiers - ext3 ne fonctionne pas bien dans les charges de travail spécifiques à la base de données. Mieux est XFS ou OCFS2. Vous avez besoin de points de repère à nouveau.
    • Surveillez, si votre système utilise Swap. L'utilisation de Swap dégrade les performances MySQL .
  2. Vérifiez si votre instance MySQL/InnoDB est correctement accordée:

    • taille tampon Taille de la piscine - Pages de données de cache en mémoire
    • innodb_Flush_Method = O_Direct - Évitez le double IO tampon
    • augmentez la taille du fichier journal InnoDB - pour la charge de travail intensive d'écriture Cela pourrait améliorer les performances. Mais rappelez-vous: la taille du fichier de journal plus grand signifie une récupération de collision plus longue. Parfois dans les heures !!!
    • innodb_flush_log_at_trx_commit = 0 ou 2 - Si vous ne vous inquiétez pas d'acide et que vous pouvez perdre des transactions pour la deuxième deuxième ou deux.
    • key_buffer_size - très important pour Myisam, mais il est utilisé pour les tables temporaires du disque.
    • Regardez votre InnoDb Statut
  3. Analyser votre charge de travail - Attrapez toutes vos questions sur le journal de SlowQueur et exécutez MK-Query-Digest dessus. Vous pouvez attraper toutes les questions à l'aide de TCPDump et Maatkit [.____]
    • Quelles requêtes prend la majeure partie de votre temps de serveur?
    • Des tableaux temporaires sont-ils créés, en particulier des tables temporaires?
    • apprendre, comment utiliser expliquer
    • Votre application utilise-t-elle des transactions? Lorsque vous exécutez des requêtes avec Autocommit = 1 (par défaut sur MySQL), chaque requête d'insertion/mise à jour commence une nouvelle transaction, qui fait des frais généraux. S'il est possible, il est préférable de désactiver l'autocommande (dans python mysql pilote autocommet est désactivé par défaut) et exécuter manuellement commettre après que toutes les modifications sont effectuées.
    • Votre application est-elle une série d'inserts sur la même table dans une boucle? Load data infile Est beaucoup plus rapide pour une série d'inserts.
    • N'oubliez pas: select count(*) from table; est beaucoup plus lent pour InnoDB que pour Myisam.
    • Quels types de requêtes d'insertion/mise à jour prennent la plupart des temps du serveur? Comment peuvent-ils être optimisés?
    • Vérifiez si votre DB dispose d'index appropriés et de les ajouter, si nécessaire.

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:

25
sumar

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.

5
tomchuk

L'allumage des moniteurs Innodb peut aider à identifier les causes des serrures et des blocages:

Show Moteur Statut Innodb et les moniteurs InnoDB

1
Martin

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.

1
Warner

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.

MySQL Docs

0
Jatinder

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.

0
Ajay Divakaran