2009-03-25 17 views
3

J'ai le scénario suivant:MySQL - SELECTS simultané - un client attend un autre?

J'ai une base de données avec une table MyISAM particulière d'environ 4 millions de lignes. J'utilise des procédures stockées (MySQL version 5.1) et une en particulier pour chercher dans ces lignes sur différents critères. Cette table a plusieurs index, et les requêtes à travers cette procédure stockée sont normalement très rapides (< 1s). Fondamentalement, j'utilise une instruction préparée et créer et exécuter du SQL dynamique dans cette recherche sp. Après l'exécution de l'instruction préparée, j'effectue "DEALLOCATE PREPARED stmt;"

La plupart des requêtes s'exécutent en moins d'une seconde (j'utilise LIMIT pour obtenir seulement 15 lignes à tout moment). Cependant, il y a quelques requêtes rares qui prennent plus de temps à s'exécuter (disons 2-3s). J'ai optimisé la table recherchée autant que possible.

J'ai développé une application web et je peux exécuter et voir les résultats des requêtes rapides en moins d'une seconde sur ma machine de développement. Cependant, si j'ouvre deux instances de navigateur et que je fais une recherche simultanée (par rapport à la machine de développement), l'une avec la requête la plus longue et l'autre avec la requête plus rapide, les résultats sont retournés en même temps. semble que la requête rapide attend la fin de la requête avant de renvoyer les résultats. c'est-à-dire que les deux requêtes prendront 2 à 3 secondes ...

Y a-t-il une raison à cela? Parce que je pensais que MyISAM gère SELECTS indépendamment les uns des autres et actuellement ce n'est pas le comportement que je vis ...

Merci d'avance! Tim

Répondre

0

Ceci est dû au fait que vous le faites depuis la même machine, si les recherches venaient de deux machines différentes, elles iraient en même temps. Souhaitez-vous vraiment qu'une personne puisse ralentir votre serveur MySQL simplement en ouvrant un tas de fenêtres de navigateur et en appuyant sur rafraîchir?

+0

Pourrait être la raison! Je ne l'ai pas encore essayé depuis différentes machines, mais je présume que tu as raison! Merci! – TMM

0

C'est vrai. Chaque requête de sélection sur une table MyISAM verrouille la table entière jusqu'à ce qu'elle soit terminée. Leur excuse est que cela aboutit à "un débit de lecture très élevé". Passer à innoDB permettra des lectures simultanées.

+2

J'aimerais voir une référence pour cette affirmation. Ce que je peux faire à partir du [manuel MySQL] (http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html) sélectionne simultanément ** ne pas ** bloquer les autres (ils acquièrent un lire le verrou). – andri