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 :

Trop de données récupérées font buger la page ? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut Trop de données récupérées font buger la page ?
    Bonsoir,

    Je souhaite transférer des données d'une base de données à une autre en modifiant quelques éléments. Pour commencer, je fais donc un select de toutes les données qu'il me faut, avec par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
    $req_recherche_donnees1 = $pdo_gamedata->prepare('SELECT GuildIdx, Name, Info, Cert, EstablishDate, LimitCount, Status, MarkRegDate, MarkRegCnt, Dissolution, gold, HiringIdx, CertDate, InfoDate FROM u_guild;');
    $req_recherche_donnees1->execute();
    $resultats_recherche_1 = $req_recherche_donnees1->fetchALL();
    $nbre_resultats_recherche_1 = count($resultats_recherche_1);
    }
    catch(PDOException $Exception) { echo $Exception; }
    Je fais un select d'environ 10 tables avec environ 1500 résultats par table. Et puis d'un coup si j'ajoute un select de plus, les requêtes qui se situent après le dernier select ajouté ne fonctionnent plus.

    A noter que c'est sur un serveur dédié avec CentoS 7.

    Est-ce un problème de mémoire allouée ?

    Comment régler ça ?

    Contenu de my.cnf:
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    user=mysql
    
    max_allowed_packet=228M
    open_files_limit = 20000
    interactive_timeout=40
    wait_timeout=40
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    old_passwords=1
    [mysqld_safe]
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    Merci d'avance

    Edit:
    Ma théorie se confirme, si j'ajoute un LIMIT 0,100 tout fonctionne, mais si je le retire ça ne fonctionne plus. Il y a donc un réglage à faire, mais je ne sais pas où ...

  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
    Points : 44 155
    Points
    44 155
    Par défaut
    "ne fonctionne plus" ?
    Tu obtiens quoi precisement ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    En faite tout ce qui est placé après le dernier select n'est plus exécuté.

    Par exemple:

    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    echo "hello";

    m'affiche hello

    mais

    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    echo "hello";
    Requête SELECT
    echo "hello";

    continu de m'afficher uniquement hello

    mais


    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    Requête SELECT
    echo "hello";
    Requête SELECT avec LIMIT 0,100
    echo "hello";

    m'affiche hellohello

    Donc je pense que c'est pile sur cette dernière requête que j'ai atteint le maximum de quelque chose.

  4. #4
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    tu as activé les exceptions pdo ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    Oui bien sûr, j'en ai parfois si je fais une erreur, mais là j'en ai aucune.

  6. #6
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as regardé si le prepare et l'execute retournait quelque chose ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je souhaite transférer des données d'une base de données à une autre en modifiant quelques éléments.
    Si les BDD sont sur le même serveur, ne peux-tu faire ça directement en SQL ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO base_reception.table_reception (/* les colonnes à alimenter */)
    SELECT /* les colonnes sources avec les calculs éventuels pour bidouiller les données à exporter */
    FROM base_source.table_source
    -- éventuellement jointure JOIN
    -- éventuellement restriction WHERE
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    Bonjour,

    J'ai à nouveau pris le temps de chercher ce qui se passe et en faite c'était lié à la mémoire allouée à PHP. Comme j'ai plus de 15 GB disponibles j'ai augmenté la valeur de memory_limit dans le fichier PHP.ini à 1000MB.

    Afin d'afficher le message j'avais simplement ajouté une ligne au début de ma page:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('display_errors', 1);
    @CinePhil:
    J'ai testé et cela fonctionne. C'est surement une meilleur idée que de charger des dizaines de milliers de résultats en mémoire et les rajouter un à un dans une base de données. Cependant, je ne vois pas comment je pourrais ajouter une valeur personnalisée dans la requête. En faite la base de données de destination contient une colonne de plus. La valeur est la même pour l'ensemble des résultats lors du lancement de la requête, mais change à chaque lancement de la requête. Il faudrait donc que via PHP je puisse définir cette valeur. Est-ce techniquement possible ?
    Une autre solution serait d'utiliser votre requête mais de lancer une requête UPDATE ensuite pour définir le contenu de la colonne partout où il n'y en a pas, c'est à dire pour les lignes qui viennent d'être ajoutées, mais à un moment ça posera peut être problème car ça parcours l'ensemble de la table.

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    La valeur est la même pour l'ensemble des résultats lors du lancement de la requête, mais change à chaque lancement de la requête. Il faudrait donc que via PHP je puisse définir cette valeur. Est-ce techniquement possible ?
    Oui, tout est possible !
    Comment cette valeur est-elle déterminée ?
    - en fonction de la valeur précédente dans la table ?
    - en fonction d'autres critères applicatifs PHP ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    Désolé j'étais en train d'éditer mon message et j'ai vu que vous avez déjà répondu.

    Pour ceux qui viendraient ici par hasard, on peut définir une valeur personnalisée pour une colonne. Par exemple utiliser la requête de CinePhil afin de transférer les 2 premières colonnes, mais en mettant une valeur personnalisée dans la 3ème donc sans reprendre la valeur de la 3ème colonne dans la base de données source. Pour cela, il suffit de faire:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO base_reception.table_reception (colonne_1,colonne_2,colonne_3)
    SELECT colonne_1,colonne_2, "9"
    FROM base_source.table_source;

    et ainsi la colonne 3 n'est pas recopiée, et aura toujours la valeur 9.

    Pour mettre une valeur définie avec PHP il suffit de faire

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO base_reception.table_reception (colonne_1,colonne_2,colonne_3)
    SELECT colonne_1,colonne_2, :VALEUR
    FROM base_source.table_source;

    et de définir le paramètre :VALEUR dans la requête PDO.

    Je ne savais pas qu'on pouvait faire cela car selon moi SELECT récupère des données, je n'aurais jamais pensé que je peux y définir une valeur personnalisée.

    C'est vraiment impression de voir tout ce qu'on peut faire, et ça fait gagner un temps fou, et utilise largement moins de ressources.

    Il serait temps que je m'intéresse aux types de requêtes que je n'ai pas l'habitude de faire

    En tout cas merci pour votre aide.
    Bonne journée

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

Discussions similaires

  1. [Web Service] page blanche car trop de données
    Par schwarzy2 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 21/04/2011, 10h41
  2. Réponses: 4
    Dernier message: 05/12/2010, 22h41
  3. export excel trop de données à envoyer
    Par laurent.w dans le forum Access
    Réponses: 9
    Dernier message: 06/02/2007, 21h22
  4. [MySQL] Problème d'insertion des donne récupère ds la BDD
    Par makaphrodite dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 30/12/2006, 12h46
  5. Réponses: 11
    Dernier message: 07/09/2006, 10h10

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