2009-12-21 4 views
2

J'ai ce problème sur notre serveur de production. La pile d'application est,La requête de type MySQL est extrêmement lente pour 5000 enregistrements.

  • Java Web App sur Tomcat 6.0.18
  • couche d'accès aux données iBatis
  • base de données MySQL 5.0
  • CentOS

Le système est déployé sur le serveur virtuel ayant environ 256 Mo de mémoire.

problème réel:

La requête comme,

select * from customer 

exécute dans environ 10 secondes si la requête suivante est exécutée,

select * from customer where code like '%a%' 

juste après l'exécution de la requête ci-dessus, la le système passe en traitement indéfini et oblige finalement Tomcat à redémarrer!

statistiques Tableau: - Nombre de disques: 5000 - Clé primaire: Code

Le même MyAdmin PHP requête exécute dans environ 4 secondes.

Pensez-vous que cela pourrait être un problème MySQL? Toute idée pour déboguer ça. Je suis en ce moment en train d'activer les journaux détaillés et je continuerai à mettre à jour cette question avec mes résultats, mais j'apprécierais vos idées de base de données.

+0

était d'écrire l'instruction dans le texte BOLD. Peut-être que je me suis trompé de balise MarkDown. Laissez-moi réparer cela – jatanp

+0

Je comprends. Je l'ai corrigé. – Asaph

+3

Je ne m'attendrais pas 'select * du client où le code '% a%'' est rapide car il ne peut pas utiliser un index. Chaque enregistrement doit être vérifié. Considérez 'select * from client où code comme 'a%'' si possible car cela pourrait utilement utiliser un index. – Asaph

Répondre

0

Il semble que votre serveur MySQL n'est pas configuré correctement, prendre 10 secondes pour 5000 enregistrements ne devrait pas être acceptable.

Comment accédez-vous à votre db, via le code java? Dans ce cas, s'il vous plaît donnez votre logique de haut niveau ici, peut-être que vous ne réutilisez pas efficacement les gestionnaires de DB.

+0

Je compte sur ibatis pour obtenir les dossiers. En fait, l'heure comprend le temps d'aller-retour HTTP et l'exécution logique. Si vous considérez le temps de db réel, il est d'environ 4 secondes. Laissez-moi modifier cela dans ma question. Aussi s'il vous plaît laissez-moi savoir ce que je devrais rechercher dans la configuration de MySQL. – jatanp

-1

Avez-vous essayé de créer un champ principal d'auto-incrémentation et de faire du code un index unique distinct.

J'ai eu des problèmes avec le texte comme clé primaire étant très lent dans certains environnements avant.

+0

Je ne peux pas faire ça. C'est un champ d'entrée utilisateur. – jatanp

2

J'ai récemment rencontré un problème similaire avec MySQL dans l'un de mes systèmes de production.

En tant que commentateur noté ci-dessus, le problème est la recherche générique sur le champ de texte, et en particulier le% principal dans la recherche.

Nous avons réduit de plusieurs ordres de grandeur le% de temps et le temps pris pour une requête de recherche (d'un serveur broyant 60 secondes + à "pas de temps du tout").

Les alternatives seraient d'utiliser un index de texte intégral ou un système comme Lucene pour la recherche.

0

Le% au début de la recherche fait que la table n'utilise jamais d'index. Le% est un caractère générique, il doit donc parcourir tous les enregistrements de la base de données. Combinez cela avec le fait que Tomcat fonctionne aussi bien qu'un MySQL est en cours d'exécution le rend encore pire.Il n'y a pas beaucoup de place pour mettre un index en mémoire à lire.

Vous devez augmenter la quantité de mémoire sur cette boîte pour permettre à MySQL de créer les caches de mémoire dont il a besoin et d'espace pour permettre aux requêtes de fonctionner rapidement.

0

Dans la question l'affiche indique que la même requête s'exécute en 4 secondes dans PHP MyAdmin, donc le problème n'est pas MySql ou l'incapacité d'utiliser un index dû au%, mais dans Tomcat ou la couche d'accès aux données.

Questions connexes