Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Lequel dois je utiliser pour les meilleures performances?
David
Hors ligne
ça change quasiment rien côté perf PDO ajoute une couche d'abstraction qui rend ton code plus portable d'une base à l'autre mais sinon c'est quasi identique
perso j'ai choisit PDO car de temps en temps j'ai un dev qui demande une base plus costaud que MySQL et je passe alors à PostgreSQL ou à Oracle
du coup pour réutiliser mes classe de persistance d'une application à une autre je n'ai pas à les développer pour chaque type de base.
j'utilise toujours les mêmes que j'enrichis au fur et à mesure. et s'il y a une particularité pour un moteur particulier alors je l'inclus dans ma classe et ainsi elle deviens portable
sinon côté perf c'est transparent
tu vas rencontrer des pb de perf avec ta base que si tes appels ne sont pas bon (comme utiliser dans des boucle les relation avec ZF au lieu de le faire dans la base) mais côté perf pure d'accès à la base c'est marginal
modif :
pour exemple j'ai une requête complexe (300 lignes de SQl) qui fait un gros calcul sur 15 tables que quelques centaines de milliers de lignes en PDO qui réponds entre 0.06s et 0.12s (PostgreSQL) ce n'est donc pas PDO qui pose PB
A+JYT
Dernière modification par sekaijin (07-03-2009 14:40:48)
Hors ligne
Ok je te remercie de ta réponse.
J'avais lu plusieurs fois sur internet qu'utiliser PDO ralentissait énormément une application.
En fait, j'avais peur d'alourdir encore mon appli en utilisant un ORM
Mais comme tu me rassures à ce sujet, je vais faire des tests avec PDO.
Pour info, voici tout ce qui se passe au chargement de ma page d'accueil, sachant que je n'utilise encore ni Zend_Db, ni Zend_View ni Zend_Form.
Temps initialisation application:
Initializer::routeStartup() =>
Initializer::setLocalisation : 27.3 millisecondes
Initializer::getEnv : 10 millisecondes
Initializer::loadConfig : 27.3 millisecondes
Initializer::loadDomaine : 13.5 millisecondes
Initializer::loadModules : 53 millisecondes
Initializer::setDatabases : 98.5 millisecondes
Initializer::setPlugins : 66.8 millisecondes
Initializer::setActionHelpers : 52 millisecondes
Initializer::setControllerDirectory : 5.8 millisecondes
RouterCustom::route() : 47 millisecondes
Initializer::preDispatch() : 31.6 millisecondes
Temps exécution requetes =>
message::getNbMessagesNonLus : 0.2 millisecondes
search::getHomeSelection : 6.2 millisecondes
search::getDerniersInscrits : 0.3 millisecondes
search::getUsedCountries : 0.2 millisecondes
temoignage::getListeTemoignages : 0.3 millisecondes
temoignage::getNbTemoignages : 0.2 millisecondes
zone::getListePays : 0.3 millisecondes
Total chargement Page (sans APC): 858.5 millisecondes
En utilisant APC, je divise par 3 le temps de chargement.
Hors ligne
le ralentissement vient bien plus souvent d'un mauvais usage que du connecteur que l'on utilise
avec ZF par exemple tu crée une classe table tu fais un fetchAll puis tu fais une boucle et pour chaque objet remonté tu fais un remonte les objets liés que tu parcourt dans une boucle pour remonter les objet liées à ces objets liées.
Dans ZF tu as des méthode toute prêtes pour remonter les objets liés pourquoi s'en priver.
mais si tu regarde bien
tu vas exploser ton temps de liaison à la base
en imaginant que tu aies 100 objets dans ta première table qui chacun son lié à 100 objets eux même lié à 100 objets
tu vas faire avec cette approche
1+ 100 + 100 x 100 requêtes soit 100101 requêtes en imaginant que tu ait un delta de 0.001 seconde entre PDO et MySQLi cela fait 100101 x 0.001 = 100 seconde de différence PDO plonbe donc tes perfs
mais en fait pour arriver au même résultat tu peux utiliser ta base pour ce qu'elle sait faire et le faire avec 1 seule requête avec des jointures et là le delta est de 0.001 seconde donc PDO ne plombe pas les perfs
on pourrais alors penser qu'il ne faut pas utiliser PDO parce que 100 seconde pour une mauvaise utilisation c'est beaucoup mais si tu regard de plus près tu verras que non. en suposant que ta base réponde en moyene en 0.01 seconde à ta requête avec la jointure tu as les temps de 0.01 pour MySQL et 0.011 Pour PDO
mais sans jointure tu vas avoir 100101 x 00.1 = 1001 seconde avec MySQLi et 1101 seconde avec PDO
de toute façon avec ou sans PDO c'est inacceptable
j'ai volontairement choisis des valeur fortes pour montrer l'amplitude de la chose. dans la réalité les disparités entre PDO et MySQLi sont bien plus minimes et les temps de réponses d'une base bien meilleur.
ce que je voulais montrer par là c'est que tu perd énormément plus en faisant un mauvais usage qu'en choisissant un connecteur ou un autre
A+JYT
Hors ligne
Oui je vois, en fait, si on fait des requetes correctes, on a quasiment aucune différence entre PDO et MySqli.
Comme la plupart de mes requetes font entre 0.2 et 6 ms, on peut imaginer que ce surcout lié à l'utilisation de PDO doit être négligeable surtout comparé aux 300 ms du chargement des librairies et initialisation des diverses configurations.
Je vais donc m'y atteler.
Merci encore pour tes conseils et ton implication (légendaire maintenant :-) ).
David
Hors ligne