Aller au contenu
sparh

Optimisation

Noter ce sujet :

Recommended Posts

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

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

  • Contenu similaire

    • Par prem
      Hello j'aurais besoin urgemment de votre aide svp... Cela fais des jours que je bloques.
      Voilà j'ai des posts , chaque posts a plusieurs categories.
      j'ai fais une requete wp_query pour lister tous les posts sauf une categorie ,mais je me retrouves avec des doublons . voila mon code 
      <?php /** * The template for displaying a grid item. * * @package WordPress * @subpackage Edition * @since Edition 1.0 */ $do_not_duplicate = array(); $query = new WP_Query( array( 'category__not_in' => array( 32 ) ) ); if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); $do_not_duplicate[] = $post->ID; global $tw_section, // section object $grid_size, // grid size $post; // section object $section_id = get_the_ID($post); // section id $tw_categories = get_categories(); // get all post categories $post_type = get_post_type(); $thumbnail_size = 'half'; $thumbnail_size = ($grid_size == 'fullgrid') ? 'big' : $thumbnail_size; if ($grid_size == 'related') { $thumbnail_size = 'related'; } ?> <div class="<?php if ( isset($tw_categories[0]->term_id) ) { echo 'highlight_category_' . $tw_categories[0]->term_id; } ?> <?php echo (has_post_thumbnail()) ? 'has-thumbnail' : 'no-thumbnail'; ?> <?php echo $grid_size;?> grid-item"> <div class="isobrick-inner"> <?php the_post_thumbnail($thumbnail_size, array( 'onload' => 'jQuery(this).animate({ "opacity" : 0.75 }, 500);' )); ?> <?php echo themewich_review_circle('none', false); ?> <?php if ( 'post' == $post_type ) : ?> <span class="thumboverdate"> <i class="fa fa-bookmark"></i> <?php themewich_date('human'); ?> </span> <?php else: ?> <?php if ( function_exists( 'wc_get_template' ) ) : ?> <span class="thumboverdate"> <?php wc_get_template( 'loop/price.php' ); ?> </span> <?php endif; ?> <?php endif; ?> <div class="thumbovertext"> <div class="badge"> <?php echo ag_get_cats(3); ?> </div> <h2 class="title"> <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php $title = get_the_title(); if (strlen($title) >= 75) { $title = mb_substr($title, 0, 75) . "... "; } echo $title; ?> </a> </h2> <?php if ( 'post' == $post_type ) : ?> <?php preg_match('/<!--more(.*?)?-->/', $post->post_content, $matches); ?> <a class="button outline" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php if ( isset($matches[1]) && $matches[1] ) { echo $matches[1]; } else { _e('Lire la suite', 'themewich'); } ?> </a> <?php endif; ?> </div> <a class="brick-thumb-link" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_title(); ?> </a> </div> </div> <?php endwhile; ?> <?php endif; ?> <?php wp_reset_query(); ?>  
       
       
      et quand je fais un var_dump ($do_not_duplicate);
      j'obtiens 
      array(1) { [0]=> int(470) }
      array(2) { [0]=> int(470) [1]=> int(368) } 
      array(3) { [0]=> int(470) [1]=> int(368) [2]=> 
       
       
      et je souhaiterai avec l'aide d'un foreach ne poster mon article qu'une fois
    • Par Jiizen
      Bonjour, 
       
      Je ne sais pas si je suis dans la bonne section car je suis un peu perdue. Mon mari a sa petite entreprise et je gère tout ce qui est devis, factures, clients, etc... Nous faisons tout en Excel : autant pour la gestion d'informations, les calculs, que pour générer les devis, les factures, etc... 
       
      Cela fonctionne très bien mais je me suis demandée si créer une application web personnelle ne permettrait pas de mieux centraliser le tout, modifier plus facilement les informations et de faire des recherches plus précises.
       
      Mais pour les documents, je me demande comment procéder... 
      Je sais que l'on peut générer des Excel à partir d'une librairie, comme PHPExcel, par exemple. Mais est-ce que ce serait vraiment intéressant de surcharger la base pour créer des fichiers à la volée à chaque fois... ? Je ne sais pas si ce serait vraiment faisable et flexible. Pour chaque ligne et chaque prix, ce serait peut-être trop lourd à gérer... ? 
      Ou sinon, j'ai juste pensé à avoir des liens qui pointeraient sur les PDF et les Excel mais il faudrait que ce soit HORS de mon dossier applicatif et que je puisse faire le lien vers un autre serveur : est-ce que c'est possible de faire ça ? 
      J'ai aussi vu en fouillant qu'il existait des bases de données NOSQL orientées documents mais je ne connais pas la souplesse de ces bases (notamment par rapport à Excel) et me demande aussi si une base SGBDR peut facilement communiquer avec ce genre de bases ? 
       
      C'est un peu long mais j'avoue que je suis un peu paumée et que je ne sais pas quelle serait la meilleure façon de procéder pour centraliser données et fichiers et avoir accès à tout très facilement. Peut-être que le gain de temps ne vaudrait pas la peine, après...  ? 
       
      Quelle est votre avis sur l'idée générale et quelles seraient vos idées pour gérer les documents ? 
       
      Je vous remercie pour vos réponses. 
       
      Bonne journée. 
    • Par Jiizen
      Bonsoir, 
       
      Pour un formulaire de contact, je suis passée par le smtp de Google en utilisant la librairie PHPMailer. Mais seulement, pour cela, il faut s'authentifier avec son adresse mail ainsi que son mot de passe...
       
      J'avoue que ça ne me branche juste pas d'écrire mon mot de passe en dur dans mon code... Est-ce que vous auriez une solution à me proposer pour éviter ça ? Je voudrais éviter une base de données pour juste un mot de passe et un mot de passe dans un fichier à part, je ne suis pas sûre que ce soit bien différent... Le sha1, j'y ai pensé, mais quand je vois qu'on peut le décrypter et le crypter sur des sites en lignes, je me demande ce que je ferai quand je créerai un site communautaire... XD (J'ai halluciné, ça sert à rien, en fait, le sha1 ? x3). 
       
      Enfin, voilà, si vous avez des propositions pour mon mot de passe, ça me serait d'une grande aide car mes mots-clé ne m'ont pas retourné quelque chose d'intéressant lors de mes recherches... 
       
      Je vous remercie pour vos réponses, une bonne soirée. :3 
    • Par billcom
      Bonjour,

      Je me retrouve encore dans l'impasse aujourd'hui avec une requête imbriqué.



      Ma base est structuré de cette façon :

      Tables :


      messagerie



      messagerie_message_type



      messagerie_utilisateur_type


      Structure table messagerie :


      id (int)



      parent_id (int)



      sujet (varchar)



      contenu (text)



      lu (bool)



      message_type (int)



      expediteur_id (int)



      expediteur_type (int)



      destinataire_id (int)



      destinataire_type (int)



      date (timestamp)


      exemple :

      [

      'id' => 1,

      'parent_id' => 0,

      'sujet' => sujet test,

      'contenu' => blablabla,

      'lu' => 0,

      'message_type => 2,

      'expediteur_id' => 9,

      'expediteur_type => 1,

      'destinataire_id' => 5,

      'destinataire_type' => 2,

      'date' => 2015-07-29

      ]



      Structure table messagerie_message_type :


      id (int)



      type (varchar)


      exemple : [ 1 => question, 2 => message, 3 => demande d'infos ]



      Structure table messagerie_utilisateur_type :


      id (int)



      type (varchar)


      exemple : [ 1 => utilisateur, 2 => entreprise, 3 => ... ]



      Relations entre les tables :


      messagerie.message_type = messagerie_message_type.id



      messagerie.expediteur_type = messagerie_utilisateur_type.id



      messagerie.destinataire_type = messagerie_utilisateur_type.id




      Je cherche à lister tous les messages qui concerne un utilisateur (expéditeur et destinataire donc).



      Ma requête :

      SELECT * FROM messagerie

      WHERE (expediteur_id = x AND expediteur_type = 1)

      OR (destinataire_id = x AND destinataire_type = 1)



      Je récupère de cette façon les id des expéditeurs et destinataires.

      J'aimerai appliquer un SELECT et faire une jointure différente selon chaque ligne retourné par la requête.



      Je ne sais pas si cela est possible.

      Je m'explique :

      Je souhaite dans la requête ci-dessus pouvoir récupérer le nom_entreprise ou le nom et prenom selon si l’expéditeur est un utilisateur ou une entreprise.



      Je ne peux pas faire une jointure normale car un utilisateur peut être à la fois un expéditeur sur un message et un destinataire sur un autre.



      Je peux faire une boucle sur les résultats de la requête ci-dessus pour arriver à mes fins mais je sais que faire une requête en bouclant sur une autre ce n'est pas le mieux.



      Si il y a des pros du SQL dans la salle merci de m'aider.



      A bientôt

    • Par billcom
      Bonjour à tous,



      J'ai, sur un site d'offre d'emploi, une liste de domaines et plusieurs offres.


      Chaque offre à un domaine correspondant.



      Structure des tables :

      table domaine
      id_domaine
      nom_domaine
      ...

      table offre
      id_offre
      id_domaine
      date
      ...

      Sur une page du site, j'aimerai lister tous les domaines ainsi que les trois dernières offres du domaine en question.



      Pour avoir ce résultat, je fais actuellement :

      Une requête qui récupère les domaines;
      Puis quand j'affiche les domaines avec un foreach(), je fais une requête qui récupère les 3 dernières offres correspondant au domaine courant.
      Le problème, c'est que faire une requête dans une boucle n'a jamais été top et effectivement la page est longue à charger.



      J'ai alors mis en cache la requête (remember / j'utilise le framework Laravel) afin que la page soit plus rapide. Cependant au premier chargement la page met très longtemps a apparaître.



      J'aimerai optimiser ce premier chargement.



      J'ai essayé de faire une requête avec une sous-requête mais sans succès et je ne sais même pas si c'est possible.



      Si vous êtes un champion de SQL ou que vous voyer la faille dans mon raisonnement, j'attend votre aide



      Merci d'avance.

×