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 :

Vitesse de calcul MySQL Vs PHP


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Par défaut Vitesse de calcul MySQL Vs PHP
    Bonjour,

    Par soucis de performance dans mon code, j'aimerais poser une question simple mais néanmoins problématique.

    La situation est la suivante : J'aimerais réaliser une série de calcul complexe comprenant des boucles, des appels a la base de donnée, des algorithmes, et l'utilisation de certaines fonctions comme la fonction RANDOM par exemple.

    Tout ces calculs sont réalisé sur des données déjà stockée dans la base de données, et ces données devront être mis à jours après le calcul.

    Ma question est donc la suivante, que dois-je choisir entre :

    - Créer une fonction PHP qui va prendre les données brut de la base, réaliser la suite de calcul, puis update les données sur la base.

    - Créer une procédure stockée directement sous MySQL qui s'occupe de prendre les données, de faire les calculs et d'update a la fin du calcul. ( La procédure stockée est alors appelée par PHP ou grâce à un trigger )

    Ma suite de calcul prenant actuellement déjà plusieurs secondes pour se réaliser ( c'est actuellement un calcul réalisé dans une fonction PHP ), j'aimerais vraiment connaitre la méthode la plus performante.

    Merci

  2. #2
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Bah si ça prend déjà plusieurs seconde en php, ça va être simple de comparer.

    Tu fait la même chose en procédure stocké et tu compare le temps d'exécution des 2 méthodes :/

  3. #3
    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
    En PHP, je pense que tu dois faire ceci :
    1) Récupérer les données dans la BDD ==> 1 requête
    2) Pour chaque ligne résultat
    a) Faire le calcul
    b) Mettre à jour la BDD ==> Autant de requêtes que de lignes

    Si les calculs sont réalisables en SQL, il est préférable de les confier au SGBD parce qu'il va travailler en une seule passe sur l'ensemble de la table.
    1) Lancement de la requête de mise à jour comprenant les calculs ==> 1 requête
    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 !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Par défaut
    Très bien, merci.

    Donc si je comprends bien.. Tout les calculs faisable sous MySQL doivent être fait ainsi..
    Dois-je comprendre que la vitesse de calcul de MySQL est supérieure a celle de PHP ?

  5. #5
    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
    Ce n'est pas exactement ça mais un SGBD est optimisé pour traiter de grandes masses de données. Les fonctions de calcul sur ces données sont donc aussi optimisées.
    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 !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Par défaut
    Ok, encore une fois merci pour vos réponses.

    Par contre, je suis quelqu'un de perfectionniste donc j'aimerais une ultime réponse pour m'assurer d'avoir bien compris les choses.

    La raison principale pour laquelle je demande une (re)confirmation est parce que ma fonction en question est très longue a coder.. Cela impliquera donc de prendre beaucoup de temps pour la porter en procédure stockée..

    De plus je pense après relecture qu'il y a peut-être eu un malentendu.

    Les calculs en question ne sont pas à réaliser sur toute les lignes d'une table. En faite ils ne concernent qu'une vingtaine de lignes spécifiques de la table.

    Voici le calcul actuel sous PHP :

    Etape 1 : Je récupère une 100taine de colonnes sur les lignes de mes tables concernées.
    Etape 2 : Je les modifies avec certains calculs impliquant des randoms, des switchs, des boucles..etc ( cela prends déjà plusieurs secondes )
    Etape 3 : J'update les lignes en question.

    ( Il ne faut pas oublier que la base doit être disponible pendant les calculs bien entendu )

    Donc en gros ma question est bel et bien portée sur la rapidité de calcul de MySQL par rapport a PHP... La base de donnée n'étant sollicitée que au début et à la fin de la fonction.

    Cette fois je ne demande qu'un "Fait le en procédure stockée" ou un "Fait le en PHP" ^^.

    Merci une dernière fois !

  7. #7
    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
    Une centaine de colonnes ? Ca fait un peu beaucoup !
    L'existence de ces 100 colonnes est-elle bien justifiée après une modélisation normalisée des données ?
    De quoi s'agit-il ?

    Une fonction aléatoire existe en MySQL : RAND.
    Par contre les switches et les boucles, pas sûr que ce soit optimum dans une BDD. Il existe la structure CASE WHEN THEN ELSE qui peut faire un switch dans une requête.

    C'est difficile de répondre sans connaitre plus précisément le besoin et la structure de la base (ou un morceau à titre d'exemple bien choisi parce que 100 colonnes... ).
    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 !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 13
    Par défaut
    Pour t'éclaircir les choses, il s'agit en faite d'un petit jeu-vidéo web-browser..
    Les 100 colonnes en question sont donc les différentes caractéristique des personnages, qui s'ajoute a ca les bonus sur ses caractéristiques..etc ce qui fait environ 100 colonnes sur 4 ou 5 tables jointes ( il y a 4 tables jointes de 24 colonnes, et ensuite quelques colonnes de quelques autres tables qui viennent se rajouter a ce chiffre).. Donc je te rassure, ce n'est pas 1 seule table qui contient les 100 colonnes .

    Donc si tu veux plus de précisions, la fonction dont je parle depuis le début du sujet est la fonction de bataille entre 2 groupes de personnages.. Chaque personnages possède 24 caractéristiques, qui viens s'ajouter a cela un éventuel bonus sur ces caractéristiques ( donc une autre table de 24 colonnes ) et qui viens s'ajouter encore une autre série de bonus ( qui est différencié des bonus précédent, mais qui contient aussi les 24 colonnes )..
    Ces combats font intervenir un nombre variable de personnages.. Qui peut aller jusqu'à 20 contre 20 maximum..

    Voila, donc le combat s'effectue sous forme d'étapes comme je l'ai dit dans mon sujet précédent.. Je récupère les informations de tous les concernés par la bataille dans des classes PHP, puis je calcul le combat sous forme de 'tour par tour' ( voilà pourquoi j'utilise une boucle ) et avec pas mal de fonctions aléatoire et d'algorithmes de calcul entre les caractéristiques des personnages qui s'affrontent... Et a la fin j'appelle la base de donnée pour modifier l'expérience, l'historique..etc

    Porter tout ca dans une procédure stockée sera pas mal difficile mais pas impossible ( a l'aide de curseurs, de loop et de CASE comme tu l'a dit ).. Car pour calculer le combat on ne se base pas réellement sur chaque caractéristiques de chaque personnages, mais sur l'addition des caractéristiques de tous les participants au combat ( en gros ).

    Voilà, maintenant tu as beaucoup plus de précisions sur la nature de la fonction énigmatique dont je te parlais depuis le début de mon sujet.. Peut-être ca pourra t'aider a me donner une réponse a ma fameuse question .. Dois-je le faire sous PHP, ou sous MySQL !

    Merci !

  9. #9
    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 la mise à jour des caractéristiques après combat est identique pour tous les joueurs ayant participé (ou au moins pour les deux groupes de joueurs si c'est un combat à un groupe contre un autre) et que ça peut se faire en une (ou deux) requêtes, le PHP sera peut-être plus rapide car, comme je l'ai dit précédemment, je ne suis pas sûr du degré d'optimisation des fonctions de condition et de boucles dans un SGBD, a fortiori MySQL.

    Si tu dois faire autant de requêtes que de joueurs (potentiellement 40 requêtes), ça vaut le coup d'essayer de faire ça en SQL parce que 40 requêtes de mise à jour par autant de transactions de PHP vers MySQL, ça risque d'alourdir sérieusement les performances.

    Je serais toi, j'essaierais les deux.
    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 !

Discussions similaires

  1. Export MySql en php
    Par pierre50 dans le forum Débuter
    Réponses: 5
    Dernier message: 11/08/2010, 13h46
  2. Migration MySql 4 - Php 5 : connaitre fonctions obsolètes
    Par chris-ren dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 20/02/2006, 11h48
  3. MySql et PHP : valeur NULL
    Par fffonck dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/02/2006, 17h02
  4. Installer apache, mysql et php sur une red hat 9 !
    Par Ruddy16 dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 07/11/2005, 21h41
  5. requête mysql sous php
    Par remi59 dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2003, 10h39

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