Question

J'ai installé MySQL instance de 5,1x sur une machine Linux (768 Mo de RAM). J'ai restauré une sauvegarde d'environ 1000 lignes et par mon application .NET (déployé sur un serveur Web différent de Windows) je fis certaines opérations de lecture qui, lorsque l'on considère que la table avait pas d'index, étaient rapides.

Je puis éclairci le serveur à partir de ces lignes et utilisé une fonctionnalité dans mon application Web sur l'autre serveur pour insérer des lignes (Au fond, je lis le texte hors d'un fichier texte, la saisie des données dans les champs d'une classe personnalisée, puis appeler une procédure stockée avec ces paramètres pour chaque enregistrement). Quand j'avais le site Web et la base de données à la fois sur ma machine locale, j'insérer 2500 lignes instantanément (moins d'une seconde). Maintenant, cependant, dans l'environnement « production », ces mêmes lignes 2500 prennent 10 minutes à insérer. J'utilise le my.cnf par défaut qui vient avec l'installation de MySQL.

Est-il possible que je peux optimiser les écritures sans compromettre la vitesse des opérations de lecture? Ou suis-je manque quelque chose évidente?

Merci d'avance!

Était-ce utile?

La solution

Avez-vous regardé la page de manuel MySQL pour la vitesse d'insertion ? La première hypothèse qui vient à l'esprit pour moi est que vous n'êtes pas envelopper l'ensemble de 2500 procédures dans Début de la transaction / Engagez déclaration, si MySQL est autocommitting chacun des 2500 actions.

Autres conseils

En plus du problème mentionné par Mark (validation automatique au lieu de transaction), je les mises à jour à l'aide certainement enquêter sur des lots. Du fait une différence majeure entre une connexion locale et une connexion réseau (même un très rapide) est le temps aller-retour.

Alors que la bande passante est très probablement pas le facteur limitant dans ce cas, faire 2500 allers-retours du réseau à la base de données et le dos prendra certainement beaucoup plus sur un réseau que sur la machine locale.

En utilisant une mise à jour batch peut réduire ces inserts à un aller-retour unique idéalement et à seulement quelques unes dans la pratique.

Malheureusement, je ne peux pas vous dire comment faire ces mises à jour par lots dans le monde .NET, Java vous utiliseriez PreparedStatement.addBatch() . Je suis sûr qu'il ya quelque chose de similaire dans .NET.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top