Aller au contenu

Optimisation


sparh

Sujets conseillés

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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é par sparh
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines plus tard...

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é par sparh
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...