IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Import de données et consultations simultanées [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut Import de données et consultations simultanées
    Bonjour,

    J'ai un site qui utilise mysql comme base de données qui permet une consultation de stock. Pour mettre à jour le stock j'importe un fichier d'environ 6000 lignes via php en réalisant un trunk de la table et un insert de chaque ligne. Cette mise à jour est faite toute les 15mn et prends environ 40s. Pendant ce temps des personnes continues à consulter le stock. Du coups il y a des risques que l'information renvoyée soit fausse. Je vois pas trop comment contourner ce problème, est-ce que vous avez une idée ?

    J'ai regardé du côté de update au lieu de insert car il me semblait que si update ne trouvait pas de correspondance il faisait un insert. Mais j'ai comme l'impression que ce n'est plus le cas ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu peux faire une requête REPLACE ou INSERT ... ON DUPLICATE KEY UPDATE.

    Il faudrait quand même savoir pourquoi il faut 40s pour insérer 6000 petites lignes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Tu peux faire une requête REPLACE ou INSERT ... ON DUPLICATE KEY UPDATE.
    J'ai continué mes recherches et je suis tombé sur le ON DUPLICATE.

    Il faudrait quand même savoir pourquoi il faut 40s pour insérer 6000 petites lignes.
    Je pense que la problématique est que je suis sur un serveur mutualisé chez OVH, c'est surement pour ça. Sur mon serveur de dev chez moi c'est mieux mais il y a quand même un décalage possible.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Pourquoi importer un fichier toutes les 15 mn pour mettre à jour un stock ?

    La base de données du stock n'est pas la même que celle qui utilisée pour enregistrer les entrées en stock et les sorties de stock ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Les sorties ne sont pas effectuées par le site mais pas l'erp. C'est juste une consultation pour nos clients.

    Les mouvements sont enregistrés dans la table des stocks de l'ERP, je l'exporte et je l'a re-importe dans la base du site pour mettre à jour la consultation.

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    N'y aurait-il pas moyen plutôt que l'application interroge directement la table de l'ERP ?
    Vous donneriez ainsi le stock en temps réel à vos clients.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Malheureusement pas avec la version de notre ERP c'est prévue pour la prochaine version. Faut juste que j'arrive à faire rentrer le planning une migration

  8. #8
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Salut,

    Je reviens sur le sujet

    Est-ce qu'il y a un moyen de faire une requête qui insert, met à jour et supprime les données inexistante dans le fichier csv ?

    Je pourrais faire une première boucle qui efface les enregistrements non présent dans le fichier puis faire une nouvelle boucle qui insert et met à jour mais je trouve tout cela pas très optimisé.

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    C'est plus rapide d'effacer la table et de tout réimporter.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Mince, du coups j'ai pas le choix, si je veux réduire le temps de traitement de l'import faut que je passe sur un serveur dédié avec un mysql optimisé ?

    J'aurais tout de même un intérêt à faire le delete puis l'update/insert. Au moins pendant l'import je n'aurais pas une table vide en train de se remplir avec le risque de renvoyer une information fausse si un visiteur interroge le site en même temps.

  11. #11
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Si REPLACE ou INSERT ... ON DUPLICATE KEY UPDATE ne sont pas satisfaisants parce que ça reste une mise à jour de toutes les lignes, et si en réalité toutes les lignes ne seraient pas systématiquement à mettre à jour (relativement peu de produits ont changé de quantité disponible), vous pouvez essayer la méthode suivante :
    1) Import brut de l'état du stock dans une table d'import vidée au préalable.
    2) Requête qui va insérer les éventuelles lignes inexistantes dans la table de stock.
    Un truc du genre :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO la_table (les_colonnes_a_alimenter)
    SELECT les_colonnes_source
    FROM la_table_import i
    WHERE NOT EXISTS
    (
    	SELECT *
    	FROM la_table t
    	WHERE t.produit_id = i.produit_id
    );
    3) Requêtes pour la mise à jour seulement des lignes nécessaires :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    CREATE TEMPORARY TABLE maj_stock 
    SELECT *
    FROM la_table_import i
    WHERE EXISTS
    (
    	SELECT *
    	FROM la_table t
    	WHERE t.produit_id = i.produit_id
    		AND
    		(
    			t.quantite <> i.quantite
    			OR
    			/* comparer la différence des autres colonnes nécessaires */
    		)
    );
     
    UPDATE la_table t 
    INNER JOIN maj_stock m ON m.produit_id = t.produit_id
    SET t.quantite = m.quantite,
    	/* idem avec les autres colonnes à mettre à jour */
    ;
     
    DROP TABLE maj_stock;

    Nota : obligation de passer par la création d'une table temporaire parce que (si ça n'a pas changé depuis le temps où j'ai eu à faire ça et ça remonte à plusieurs années) MySQL refuse de mettre à jour une table qui est dans les conditions de restriction d'une requête.

    Dommage que MySQL ne connaisse pas les requêtes MERGE.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #12
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    J'ai effectivement commencé à étudier cette solution mais avant d'aller plus loin il y aurait peut être plus simple.

    Import dans une table temporaire, drop de la table principal puis renommage de la table temporaire. Le drop et le renommage sont quasiment instantanée il me semble.

    [EDIT]L'option table temporaire, import, drop ancienne table et renommage table temporaire marche bien. Ca ne règle pas le problème du temps d'importation (timeout apache) mais au moins je n'ai plus de moment de flottement pendant l'import.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Importer des données grace a des *.cvs dans MySQL
    Par Mic0001 dans le forum Installation
    Réponses: 3
    Dernier message: 05/01/2005, 19h26
  2. [CR]Importer des données d'une feuille excel
    Par rolan dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 17/12/2004, 22h32
  3. Réponses: 3
    Dernier message: 13/12/2004, 13h54
  4. Importer des données dans sql server avec DELPHI ???
    Par moutanakid dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/08/2004, 17h22
  5. Importation de données postgresql
    Par ythierrin dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 10/10/2003, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo