sparh Posté 13 Septembre 2012 Posté 13 Septembre 2012 Bonjour, j'ai dans une table Membre de ma base sql contenant 10 000 enregistrement. Je souhaite vérifier que tel user_id correspond bien à tel user_name. J'ai 2 solutions : - faire une requête sql à chaque fois (si 1 résultat alors la correspondance existe) - faire une requête sql pour extraire user et userid que je met dans un tableau php et le tout en cache (durée de vie du cache très longue), quand j'ai besoin de vérifier, je n'ai qu'à chercher dans le tableau. (donc pas de requête sql) Quel est la solution la plus optimale selon vous ? (peux être y'a t'il de meilleur solutions auxquelles je n'ai pas pensé) Merci d'avance
jcaron Posté 13 Septembre 2012 Posté 13 Septembre 2012 Si je comprends bien, c'est une vérification que tu veux faire lors de certaines requêtes sur ton site (par opposition à vérifier tout ça d'un coup une seule fois)? Je ne sais pas à quel "cache" tu fais allusion, mais s'il s'agit de générer un source php qui correspond au contenu de la table, alors le temps de charger, parser et interpréter ce source risque d'être nettement plus long et plus couteux en ressources que de faire une requête SQL. L'option idéale si tu as vraiment beaucoup de requêtes ce serait d'utiliser un cache comme memcached (avec une entrée par ligne). Une autre option consiste à utiliser un fichier type GDBM ou équivalent (histoire de bénéficier de l'index qui va avec). Mais sinon la requête SQL ne devrait pas être trop problématique. Jacques.
sparh Posté 13 Septembre 2012 Auteur Posté 13 Septembre 2012 (modifié) Voilà concrètement les 2 solutions : - la version avec une requête sql : SELECT user_id FROM Membre WHERE user_name ='un nom' - la version tableau php avec mise en cache function check_name($user_id){global $chemin_include ;$nom_cache = $chemin_include.'/cache/tablo_membre.html';$expire = time() - 60*60*24*7 ; if(file_exists($nom_cache) && filemtime($nom_cache) > $expire){ $tablo = unserialize(file_get_contents($nom_cache));}else{connection_BD();$sql = "SELECT user_id,user_name FROM Membre ORDER BY user_name ASC";$req=send_sql($sql,'recup techniciens');while($row=mysql_fetch_array($req)) {$tablo[]=$row;}mysql_free_result($req);$tablo_cache = serialize($tablo);create_cache($nom_cache, $tablo_cache) ;}for($i=0;$i<count($tablo);$i++){if($tablo[$i]['user_id'] == $user_id ) { return $tablo[$i]['user_name']; exit();}}return 'error';} Modifié 13 Septembre 2012 par sparh
jcaron Posté 13 Septembre 2012 Posté 13 Septembre 2012 La première solution est très très très très très certainement beaucoup plus efficace que la deuxième (si bien sûr tu as l'index qui va bien sur la table). Le unserialize(file_get_contents()) à lui tout seul doit coûter plus cher que la requête SQL, et je ne te parle même pas de la boucle sur le tableau pour chercher l'id. Jacques.
sparh Posté 13 Septembre 2012 Auteur Posté 13 Septembre 2012 ok merci d'avoir pris le temps de regarder
sparh Posté 28 Septembre 2012 Auteur Posté 28 Septembre 2012 (modifié) Bonjour, je revient sur ce sujet car je tombe sur exactement le même problème et je ne suis toujours pas sur de la méthode à utiliser. Cette fois ce sont les infos générales du site (url, email de contact, titre du site etc) qui sont stockées sur la base de données. J'ai donc besoin de ces données à chaque affichage de page ce qui peux représenter rapidement beaucoup de requêtes (inutiles)! Vous m'avez dit qu'une fonction de type :http://www.webmaster...on/#entry344920 n'était pas optimale non plus, mais alors comment faire ? Merci d'avance Modifié 28 Septembre 2012 par sparh
jcaron Posté 28 Septembre 2012 Posté 28 Septembre 2012 La fonction évoquée était loin d'être optimale parce que tu stockais l'ensemble de la table, que tu devais donc la lire en entier, et ensuite faire une recherche dedans, pour récupérer une seule ligne. Dans la cas présent, je suppose qu'il n'y a qu'une seule ligne à récupérer. Dans ce cas, ça peut être plus efficace de procéder comme ça. La meilleure solution consiste à tester les deux options et mesurer combien de temps ça prend (dans une boucle qui répète l'opération quelques milliers de fois pour bien se rendre compte). Jacques.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant