Quel moteur utilisez-vous pour MySQL? La chose à noter ici est si vous utilisez MyISAM, alors vous allez avoir des problèmes de verrouillage en raison du verrouillage de la table que le moteur utilise.
De: MySQL Table Locking
verrouillage de table est également désavantageux dans le scénario suivant:
* A session issues a SELECT that takes a long time to run.
* Another session then issues an UPDATE on the same table. This session
waits until the SELECT is finished.
* Another session issues another SELECT statement on the same table.
Because UPDATE has higher priority than SELECT, this SELECT waits for the UPDATE to finish,
after waiting for the first SELECT to finish.
Je ne vais pas les répéter ici, mais la page a quelques conseils sur la concurrence de plus en plus sur une table au sein de MySQL. Évidemment, une option serait de passer à un moteur comme InnoDB qui a un mécanisme de verrouillage de rangée plus complexe qui, pour des tables de simultanéité élevée, peut faire une énorme différence de performance. Pour plus d'informations sur InnoDB, rendez-vous au here. Avant de changer le moteur, il serait probablement utile de regarder les autres conseils comme s'assurer que votre table est indexée correctement, etc. car cela augmentera les performances de sélection et de mise à jour quel que soit le moteur de stockage.
Modifier fonction de l'utilisateur commentaire:
Je dirais que c'est une solution possible en fonction des symptômes que vous avez décrits, mais il ne peut pas être celui qui vous où vous voulez être. Il est impossible de dire sans plus d'informations. Vous pouvez effectuer des analyses de table complètes en raison de l'absence d'index. Cela peut provoquer une contention d'E/S sur votre disque, ce qui exacerbe les verrous de table utilisés par MyISAM. Si tel est le cas, alors la racine de la cause est l'indexation incorrecte et rectification qui serait votre meilleur plan d'action avant de changer les moteurs de stockage.
Assurez-vous également que vos tables sont normalisées. Cela peut avoir des implications profondes sur les performances en particulier sur les mises à jour. Les tables normalisées peuvent vous permettre de mettre à jour une seule ligne au lieu de centaines ou milliers dans une table non normalisée. Ceci est dû à des valeurs non dupliquées. Il peut également économiser d'énormes quantités d'E/S sur les sélections car la base de données peut mettre en cache plus efficacement les blocs de données. Sans connaître la structure de les tables avec lesquelles vous travaillez ou les index que vous avez présents, il est difficile de vous fournir une réponse plus détaillée en .
Modifier après que l'utilisateur a tenté à l'aide InnoDB:
Vous avez dit que votre processus Java est multi-thread. Avez-vous essayé d'exécuter le processus avec un seul thread? Je me demande s'il est possible que vous envoyiez les mêmes lignes pour mettre à jour plusieurs threads et/ou que la mise à jour à travers les threads provoque des problèmes de verrouillage.
En dehors de cela, je voudrais vérifier les éléments suivants:
- Avez-vous vérifié votre expliquer les plans pour vérifier que vous avez des coûts raisonnables et que la requête utilise effectivement les indices que vous avez?
- Vos tables sont-elles normalisées? Plus précisément, mettez-vous à jour 100 lignes lorsque vous pourriez mettre à jour un seul enregistrement si les tables étaient normalisées?
- Est-il possible que vous manquiez de mémoire physique lorsque le processus Java est en cours d'exécution et que la machine est occupée à échanger des données?
- Inondez-vous votre disque (un seul disque?) Avec plus d'IOP qu'il ne peut raisonnablement gérer?
Sommes-nous capables de voir la structure select/db pour voir s'il y a quelque chose de simple que vous auriez pu manquer? –
Structure de la table? Quel est le SQL pour les requêtes d'insertion qui causent des problèmes? Quel est le SQL pour les sélections qui s'exécutent lentement? Quels index avez-vous? –