2010-04-28 14 views
3

J'ai cette application LAMP avec environ 900k lignes dans MySQL et j'ai quelques problèmes de performance. Contexte - Outre la pile LAMP, il existe également un processus Java (multithread) qui s'exécute dans sa propre JVM. Ainsi, avec LAMP & java, ils forment la solution complète. Le processus Java est responsable des insertions/mises à jour et de quelques sélections également. Ces insertions/mises à jour sont généralement en vrac/lot, entre 5 et 150 lignes. Le code frontal PHP ne fait que des SELECT.Performance MySQL

Problème: les requêtes PHP/SELECT deviennent très lentes lorsque le processus Java est en cours d'exécution. Lorsque le processus Java est arrêté, SELECT fonctionne bien. Je veux dire que la différence de performance est énorme. Lorsque le processus Java est en cours d'exécution, toute action effectuée sur l'interface frontale php entraîne 80% et plus d'utilisation du processeur pour le processus mysqld.

Toute aide serait appréciée. MySQL fonctionne avec les paramètres par défaut &.

pile logicielle -

  • Apache - 2.2.x
  • MySQL -5.1.37-1ubuntu5
  • PHP - 5.2.10
  • Java - 1.6.0_15
  • OS - Ubuntu 9,10 (karmic)
+0

Sommes-nous capables de voir la structure select/db pour voir s'il y a quelque chose de simple que vous auriez pu manquer? –

+1

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? –

Répondre

0

Nous aurions besoin de savoir beaucoup plus sur le système pour dire si c'est normal ou comment résoudre le problème.

avec environ 900k lignes dans MySQL

Je dirais que fait très petit - donc si mal son exécution alors vous allez très mal quelque part.

Activez le journal de requête pour voir exactement quelles requêtes s'exécutent, priorisez en fonction du produit de fréquence et de durée. Jetez un coup d'œil aux plans d'explication, créez des index. Pensez à diviser la base de données entre plusieurs disques.

HTH

C.

4

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:

  1. 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?
  2. 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?
  3. 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?
  4. Inondez-vous votre disque (un seul disque?) Avec plus d'IOP qu'il ne peut raisonnablement gérer?
+0

Oui, j'utilise MyISAM. Donc, compte tenu de mon scénario, il est recommandé de passer à InnoDB? – kapso

+0

J'ai essayé InnoDB, obtiens le même comportement :( – kapso

+0

ce qui m'étonne quand le processus java (inserts/updates) ne fonctionne pas, la base de données est vraiment très rapide et dès que le processus java est lancé, mysql commence à crawler. – kapso