PHP se déplaçant les données entre les tables MySQL

  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Décembre 5th, 2011, 8:59 am

J'essaie de déplacer les données d'une table à l'autre mais son cours extrêmement lente.

J'ai customeraddresses qui a 52000 records. Je veux passer ces documents à une autre table (sur la même DB) appelée clientaddresses à l'aide de cause PHP, que je dois faire une logique parce que customeraddresses et clientaddresses ont des changements mineurs de structure DB. Je tirer tout par un champ de clientID INDEX, mais y a-t-il autre chose je sinon je peux faire pour accélérer le processus ? Im coup via cron sur un serveur interne avec un processeur hexcore, 4 Go de mémoire et la faible utilisation du script.

J'ai simplement :

Code: [ Select ]
//connect to db...
$obj = object connection class.

SELECT * FROM customeraddresses

while mysql_fetch_array() {

   clientID = row[clientID];
   street = row[street];
   city = row[city];
   mailing = row[mailing]; // enum 1,2

    // small logic
      if mailing == 1 ...

 INSERT INTO clientaddresses(clientID,...) VALUES('clientID',...);


}
  1. //connect to db...
  2. $obj = object connection class.
  3. SELECT * FROM customeraddresses
  4. while mysql_fetch_array() {
  5.    clientID = row[clientID];
  6.    street = row[street];
  7.    city = row[city];
  8.    mailing = row[mailing]; // enum 1,2
  9.     // small logic
  10.       if mailing == 1 ...
  11.  INSERT INTO clientaddresses(clientID,...) VALUES('clientID',...);
  12. }



Existe-t-il des raisons pourquoi cela devrait prendre 2 heures pour transférer 52 k records ? Quelles sont certaines choses que je peux regarder à accélérer tels que :

Seront ajoutant un décalage de limite, lignes à la sélectionner utile et créer une autre boucle pour modifier le décalage ?
Dois je juste être construire l'INSERT interroge et enregistrer un fichier .sql et ensuite les importer ? Qui seront les plus rapidement ?
Programmation OO utilise pour ma connexion et les requêtes de ralentir les choses ? (J'ai une classe très simple pour se connecter, la sélection et l'insertion de données)

Merci pour les pointeurs.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Décembre 5th, 2011, 8:59 am

  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de l’utilisateur
  • Inscription: Déc 20, 2002
  • Messages: 8925
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Online

Message Décembre 5th, 2011, 11:50 am

Il n'y a quelques raisons, que cela va extrêmement lent. Le premier est le fait que vous font une lecture et écrivez pour chaque cycle de 52000 times. Si ses cours :

LIRE
ÉCRIRE
LIRE
ÉCRIRE
...

Qui va toujours être lent, surtout si vous utilisez les tables MyISAM et c'est de 104 000 opérations distinctes.

La deuxième raison, qu'il pourrait être lent, c'est comment vous avez index défini. Tout d'abord les lectures pourraient être lentes si vous n'avez pas d'index, cependant, si vous n'avez pas les index ensuite les parties lecture pourraient être rapides. De l'autre côté, si vous n'avez pas les index puis ensuite il fera le processus d'écriture prennent plus de temps comme après chaque écriture que l'index devront être réécrite.

Mes conseils pour vous pour accélérer cette est donc de le faire dans les plus grands blocs. Instance a peut-être lire les 100 premiers enregistrements à l'aide d'une clause limit. Stocker dans un tableau et puis créer tous le SQL que vous allez utiliser pour écrire le prochain 100 records. Une fois que vous avez créé en fait exécuter ensuite les commandes INSERT. De cette façon pour chaque 100 dossiers vous font une lecture et large empiècement.

Ainsi, par exemple :

MYSQL Code: [ Select ]
SELECT * FROM customeraddresses
LIMIT 0,100
  1. SELECT * FROM customeraddresses
  2. LIMIT 0,100


Alors pour l'insérer quelque chose comme ceci :

MYSQL Code: [ Select ]
INSERT INTO clientaddresses(clientID,...)
VALUES
('clientID1'...),
('clientID2'...),
('clientID3'...),
('clientID4'...),
('clientID5'...),
('clientID6'...),
...
('clientID100'...);
  1. INSERT INTO clientaddresses(clientID,...)
  2. VALUES
  3. ('clientID1'...),
  4. ('clientID2'...),
  5. ('clientID3'...),
  6. ('clientID4'...),
  7. ('clientID5'...),
  8. ('clientID6'...),
  9. ...
  10. ('clientID100'...);


Qui devrait vous permettre de constater une différence considérable dans combien de temps cela prend puisque vous pourrait réduire le nombre d'opérations de lecture/écriture sur votre base de données par un facteur de 100. Vous pourriez probablement faire cela dans 1000 taille ou plus grands blocs ainsi selon la quantité de données est transféré et combien de mémoire, vous êtes en mesure d'utiliser.
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Décembre 8th, 2011, 9:34 am

C'est ce que j'avais besoin de savoir. Je réfléchissais trop petit en termes de SQL. Sa va me prendre un peu d'obtenir que mis ensemble, mais j'afficherons ici comment il est allé.

Merci. IVe a essayé plusieurs différentes modifications mineures qui tous prennent le temps de leur propre chef et aucun n'a payé afin que j'apprécie le chemin d'accès de conseils qui me donne un bon coup, une fois complet, à accélérer cette chose.
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de l’utilisateur
  • Inscription: Déc 20, 2002
  • Messages: 8925
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Online

Message Décembre 8th, 2011, 12:08 pm

Veuillez rester affiché comment ça se passe, je serais curieux de savoir si vous remarquez une grosse différence:)
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Décembre 9th, 2011, 1:38 pm

Je termine la réécriture du script de construire l'étendue des requêtes et a déjà couru le script. Jusqu'à présent, on dirait qu'il a fallu le transfert vers le bas à l'origine de 2,5 heures à environ 30 minutes. Oui, tout à fait une grande différence. Évidemment, les écritures individuels étaient la principale raison de la lenteur.

Merci pour votre aide. Je pense que maintenant je peux travailler sur peu de logique à l'intérieur de la boucle qui peut-être aider à accélérer le script encore plus et mal être définie pour quand je dois déployer cette chose. Nous sommes permutation des serveurs pour cela réduira notre temps d'inactivité avec certitude (environ 2 h).
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de l’utilisateur
  • Inscription: Déc 20, 2002
  • Messages: 8925
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Online

Message Décembre 11th, 2011, 11:45 am

Pas de problème, heureux, je pourrais aider:)

Ressemble à son environ 5 x plus rapide qu'avant ! Curieux de la taille des blocs vous font à la fois ? Avez-vous essayé d'ajuster ce tout pour voir si elle rend toute autre différence ?
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Décembre 13th, 2011, 12:50 pm

Non, j'ai gardé à 5000 records « LIMIT 0, 5000 ». Afin de garder mes écritures vers le bas. Toutes les tables sont relationnelles et la table principale a un peu plus de 40 k records, donc à 5000, je devrais être écrit 9 fois. Je me sentais comme c'était un bon point de départ.

Im va basculer la cause de taille chunk Ive a obtenu pour l'exécuter 3 ou tant de fois plus en tout cas pour les tests. Malade post précédent mon temps exécution à des tailles différentes chunk.
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Décembre 18th, 2011, 10:18 am

Im curieux quelle sorte de logique obtient appliquée à la conversion de la table à la table. Ma première pensée est de copier la table utiliser ALTER TABLE et peut-être quelques trucs qui pouvaient utiliser les index au lieu de chaque ligne de traitement lors de l'application de la logique.
Strong with this one, the sudo is.
  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Décembre 22nd, 2011, 4:22 pm

Eh bien, tout d'abord au large j'apercevoir joeberterator. Comme elle. Je change fondamentalement quelque 1 ou 0 pour oui ou non. Ma base de données, j'aimerais utiliser O/N ou domaines énumérés oui ou non. Le transfert des Im table d'utilise 1 ou 0 pour oui ou non. Donc, je ne peux pas regarder la db et toujours savoir qu'est-ce que. Aussi, ses plus facile à utiliser les données dans mon programme sans avoir à ajouter cette logique à chaque page qui tire le 1 ou 0 pour le changer. Autre que celle, je peux fixer des quelques dates mais essentiellement ses le champ de bits changer à énuméré.
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Décembre 24th, 2011, 1:35 pm

Im penser une copie de la table pourrait faire quelques sommets de minutes, particulièrement si theyre avec les tables MyISAM et l'autre sont à explorer la copie des fichiers MySQL utilise pour stocker ces tables tel que suggéré dans le premier paragraphe de cette page . (ensuite secondes plutôt que minutes)

Ensuite, ALTER TABLE pour ajouter une colonne ENUM avec une valeur par défaut de no. Puis mettre à jour pour modifier cette valeur de colonnes Oui où votre colonne existante est 1.
Strong with this one, the sudo is.
  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Décembre 28th, 2011, 7:28 am

Après avoir examiné les tableaux, je pense que je peux faire que de quelques-uns des tables qui permettra de réduire le nombre de tables, j'ai effectivement à reconstruire. Im juste à court de temps cette chose et je ne sais pas si j'ai le temps à venir avec une procédure ALTER TABLE pour corriger toutes les tables. Le script de synchronisation s'exécute dans environ 30 minutes et déjà gère tout parce que bon nombre des tables diffèrent un peu, mais je crois qu'il y a certains tableaux qui ne change pas beaucoup vraiment et qui peut être transféré avec environ 3 commandes SQL à l'aide de cette méthode. Im continue de travailler sur certains aujourd'hui et voir. Merci pour l'aide.

Afficher de l'information

  • Total des messages de ce sujet: 11 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 87 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC