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 :

Lenteurs des requêtes pendant une tâche cron qui en fait plus de 20 000.


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    Par défaut Lenteurs des requêtes pendant une tâche cron qui en fait plus de 20 000.
    Bonjour,

    Sur un serveur dédié 4 coeurs et 16 Go de RAM j'ai une tâche cron qui permet de copier une partie d'une base de données dans une autre afin de constituer un historique. Le problème est que cela copie quelques dizaines de milliers de lignes, et prend donc quelques secondes. Et à chaque fois que la copie est en cours, si une autre requête se lance, elle met beaucoup plus de temps, ce qui peut poser problèmes et ralentissements.

    Je souhaite donc savoir s'il y a une solution qui permet de conserver ce système de copie, sans que ça perturbe les autres requêtes.

    Pendant la copie je vois l'utilisation du processeur qui augmente, mais il reste à moins de 80% (contre 65-70% en temps normal). La RAM quant à elle n'est même pas utilisée à un quart.

    Et pourtant j'ai optimisé au maximum:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req_transfere_donnees3 = $pdo_gamedata_sauvegarde->prepare('INSERT INTO GameDB_sauvegarde.u_hench_0 (nom_de_la_table) SELECT nom_de_la_table FROM GameDB.u_hench_0;');
    Je vous remercie d'avance.

  2. #2
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Salut,

    Pourquoi utiliser prepare si tu n'as pas besoin de préparer ta requête ?
    J'imagine que tu n'as pas besoin d'avoir un résultat en retour donc il vaut mieux utiliser PDO::exec() dans ton cas.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO GameDB_sauvegarde.u_hench_0 (nom_de_la_table) SELECT nom_de_la_table FROM GameDB.u_hench_0;

    nom_de_la_table
    Ce ne serait pas plutôt nom_de_la_colonne ?

  3. #3
    Membre éclairé
    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
    Par défaut
    Bonjour,

    C'est le nom de la colonne bien sûr, je me suis trompé.

    PDO::exec() permet-il une exécution plus rapide de la requête ?

    Selon moi le problème c'est la tâche cron qui prend plusieurs secondes à s'exécuter, et si pendant ces quelques secondes une autre requête est lancée, elle se place en attente à la fin de la tâche cron, ce qui cause la lenteur d'exécution. Il faudrait que les requêtes s'exécutent en simultanée par exemple.

  4. #4
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    PDO::exec() permet-il une exécution plus rapide de la requête ?
    Il me semble, vue que ça ne retourne que le nombre de lignes affectées par la requête.
    Mais peut-être qu'utiliser PDO ralenti le traitement, il faut essayer avec mysqli.

    Selon moi le problème c'est la tâche cron qui prend plusieurs secondes à s'exécuter, et si pendant ces quelques secondes une autre requête est lancée, elle se place en attente à la fin de la tâche cron, ce qui cause la lenteur d'exécution. Il faudrait que les requêtes s'exécutent en simultanée par exemple.
    As-tu essayé de lancer ta requête directement dans l'interpréteur pour voir le temps d'exécution ?

    Quel moteur utilises-tu, MyISAM, InnoDB, ... ?
    MyISAM peut être plus rapide dans certains cas.

    Pourquoi sauvegarder une partie de la base de données et pas la totalité avec un Dump ?

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    La question serait plus tôt, une modification de 20000 lignes en Cron, pourquoi le faire en PHP et non pas via un script direct en DB ?

  6. #6
    Membre éclairé
    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
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    La question serait plus tôt, une modification de 20000 lignes en Cron, pourquoi le faire en PHP et non pas via un script direct en DB ?
    Ce serait peut être préférable pour ne pas passer par PHP et donc réduire la charge du serveur.

    J'ai tenté de créer un event avec ça via SQL Yog:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DELIMITER $$
     
    CREATE	/*[DEFINER = { user | CURRENT_USER }]*/	EVENT `GameDB_sauvegarde`.`Sauvegarde`
     
    ON SCHEDULE EVERY 1 MINUTE STARTS '2020-06-04 00:00:00'
     
    DO
    	BEGIN
    	    INSERT INTO GameDB_sauvegarde.matable (le_nom_du_champ,DateHeure) SELECT le_nom_du_champ,NOW() FROM GameDB.matable ;
    	END$$
     
    DELIMITER ;
    mais le problème est que rien ne se lance ...

    Alors que si je lance la requête directement, la copie se fait comme il faut.

    event_scheduler est déjà à ON.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/09/2015, 13h25
  2. Réponses: 12
    Dernier message: 17/04/2014, 09h56
  3. Autochargement des classes dans une tâche CRON
    Par sebastien.bordat dans le forum Langage
    Réponses: 1
    Dernier message: 13/06/2013, 23h22
  4. Lancer une tâche planifiée qui ne s'arrête pas
    Par bart64 dans le forum Windows Serveur
    Réponses: 12
    Dernier message: 02/10/2006, 19h33
  5. Fichier log des requêtes d'une bdd
    Par Sub0 dans le forum Administration
    Réponses: 4
    Dernier message: 22/03/2004, 14h12

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