Le plus performant ? Faire le moins d'accès base ou faire des accès simples ?

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par indigene, 22 Septembre 2015.

  1. indigene
    indigene WRInaute accro
    Inscrit:
    7 Septembre 2003
    Messages:
    4 101
    J'aime reçus:
    176
    Jusqu'à présent j'étais persuadé qu'il fallait faire le moins d'accès possible en base mySQL pour être performant

    Mais avec cet ordre j'ai tendance à en douter :
    Code:
    $select = "SELECT a.`id` AS NUM, a.`id` AS PARENT, a.`nom` AS NAME, a.`nom-page`, a.`etat`, a.`gvip`, a.`ordre` AS TRI, a.`id` AS PERE FROM `table_categories` a 
           WHERE a.`etat` = '1' AND a.`parent_id` = 0 AND a.`gvip` <> '1' 
           AND a.`id` IN (SELECT c.`parent_id` FROM `table_categories` c WHERE c.`etat` = '1' AND c.`parent_id` <> 0 AND c.`gvip` <> '1')
    UNION  
    SELECT a.`id` AS NUM, a.`id` AS PARENT, a.`nom` AS NAME, a.`nom-page`, a.`etat`, a.`gvip`, a.`ordre` AS TRI, '0' AS PERE FROM `table_categories` a 
           WHERE a.`etat` = '1' AND a.`parent_id` = 0 AND a.`gvip` <> '1' 
           AND a.`id` NOT IN (SELECT d.`parent_id` FROM `table_categories` d WHERE d.`etat` = '1' AND  d.`parent_id` <> 0 AND d.`gvip` <> '1')
    UNION  
    SELECT b.`id` AS NUM, b.`parent_id` AS PARENT, b.`nom` AS NAME, b.`nom-page`, b.`etat`, b.`gvip`, b.`ordre` AS TRI, '0' AS PERE FROM `table_categories` b 
           WHERE b.`etat` = '1' AND b.`parent_id` <> 0 AND b.`gvip` <> '1' 
    ORDER BY PARENT, NUM, TRI, NAME";
    
    Voici la structure de la table :
    Code:
    id         Primaire     int(11)
    parent_id  int(11)
    nom        varchar(100)
    nom-page   varchar(100)
    etat       tinyint(4)
    gvip       tinyint(4)
    ordre      int(11)
    
    Cette table contient la liste des catégories et me permet deux choses :
    - afficher le menu dans le header
    - rappeler les liens de navigation dans le footer
    Il faut que l'état soit à '1' pour que la catégorie soit active
    Mais il peut y avoir des sous-catégories. Dans le header j'affiche le nom de la catégorie et ensuite les sous-catégories dans un menu déroulant. Mais dans le footer je n'affiche que les sous-catégories
    Les catégories sont triées par 'ordre' et les sous-catégories d'une catérogie sont triées par 'ordre'. Mais il me faut un système pour que la catégorie arrive avant les sous-catégories pour gérer le header, d'où la zone PARENT.

    Le premier SELECT (avant union) me sort la liste de toutes les catégories actives qui possèdent des sous-catégories actives. La zone PERE est renseignée pour indiquer que la catégorie possède des sous-catégories (format différent dans le header)

    Le premier UNION me sort la liste de toutes les catégories actives qui ne possèdent pas de sous-catégories.

    Pour ces deux SELECT, la zone PARENT sera égale à la zone ID ce qui signifie que ce ne sont pas des catégories possédant des sous-catégories

    Le second UNION me sort la liste de toutes les sous-catégories actives avec la zone PARENT contenant le numéro de la catégorie parente

    Lors de la lecture du résultat je constitue à la volée ma zone de navigation du footer en éliminant certaines pages inutiles :
    Code:
    if (($cat['id'] != 1) AND ($cat['nom-page'] != "contact.html") AND ($cat['nom-page'] != "")) { 
                     $NAVIG .= "<li><a href=\"/".$cat['nom-page']."\" target=\"_top\">".$name."</a></li>\n";
    Ensuite j'écris mon header et à la fin je prend bien soin de refermer une liste UL si jamais il en reste une d'ouverte (dernière catégorie qui possède des sous-catégories)
    Code:
    if ($cat['PERE'] == 0) {
        if ($cat['NUM'] == $cat['PARENT']) {
            if ($ouv == 1) { $ouv = 0; ?>
       <!--Divers--></ul>
       </li>
    </ul>  
         <?   }
    ?>
    <li<? if ($MENU == $cat['NUM']) { echo " class=\"active\"";} ?>><a href="/<?=$cat['nom-page'] ?>"><?=$cat['NAME'] ?></a></li>
    <? } else { ?>
    <li><a href="/<?=$cat['nom-page'] ?>"><?=$cat['NAME'] ?></a></li>
    <? } } 
    else {  $ouv = 1;  ?>
    <ul class="nav">
       <li class="dropdown<? if ($MENU == $cat['NUM']) { echo " class=\"active\"";} ?>"><a href="#" class="dropdown-toggle" data-toggle="dropdown"><?=$cat['NAME'] ?>&nbsp;<small>&#9660;</small></a>
       <ul class="dropdown-menu">
    <? } ?>
    <? } // while 
            if ($ouv == 1) { $ouv = 0; ?>
       <!--Divers--></ul>
       </li>
    </ul>  
         <?   }    ?>
    </ul>
    Tout fonctionne parfaitement comme je le veux.

    Mais je me demande quand même si ça n'aurait pas été mieux de faire un SELECT plus simple pour afficher le header et de recommencer un autre SELECT, mais différent, pour constituer mes liens de navigation du footer. Ca aurait fait deux accès base au lieu d'un seul, mais des choses beaucoup moins complexes.

    D'après-vous, ça reste quand même meilleur de faire moins d'accès ou pas ?
     
  2. loubet
    loubet WRInaute impliqué
    Inscrit:
    19 Février 2003
    Messages:
    788
    J'aime reçus:
    0
    pas regardé en détail, mes 2 (ou plus) requetes qui vont utiliser des index, c'est mieux qu'une seule qui ne va pas en utiliser.
    executer les requetes dans phpmyadmin et cliquer sur "Expliquer SQL" pour voir ce qu'il en ai.
     
Chargement...
Similar Threads - performant accès base Forum Date
Balise title une structure performante linéaire ou non ? Débuter en référencement 10 Janvier 2022
Quel type de logiciel utiliser pour créer un site web simple et performant ? Demandes d'avis et de conseils sur vos sites 14 Octobre 2019
Google moins performant Google : l'entreprise, les sites web, les services 21 Octobre 2015
cms moin connus mais trés performants Développement d'un site Web ou d'une appli mobile 2 Décembre 2013
Besoin d'un hebergement mutu performant au usa ... Administration d'un site Web 29 Août 2012
Hébergeur minimal mais très performant Administration d'un site Web 6 Juin 2012
Quels critères utilisez-vous pour choisir un spécialiste Adwords performant ? AdWords 4 Mai 2012
Recherche complexe et performante dans une base mysql ? Développement d'un site Web ou d'une appli mobile 9 Juin 2011
un VPS ? pas cher et performant, ça doit exister, non ? Administration d'un site Web 3 Février 2011
Hébergement mutualisé performant (Infomaniak, Hostgator ou OVH?) Administration d'un site Web 8 Décembre 2010
Adwords : campagnes beaucoup moins performantes que l'an passé. HELP. AdWords 5 Juillet 2010
Dotclear 2.1.6 et WordPress 2.9: Le plus performant pour le référencement Problèmes de référencement spécifiques à vos sites 30 Janvier 2010
Referencement performant sauf sur mots clefs importants Problèmes de référencement spécifiques à vos sites 17 Octobre 2008
L'outil iwebtool est il performant ? Débuter en référencement 26 Juillet 2007
Slideshow tres performant! Développement d'un site Web ou d'une appli mobile 19 Janvier 2007
Script annuaire le + performant Administration d'un site Web 2 Juillet 2006
recherche plateforme multi blog, très performante... Développement d'un site Web ou d'une appli mobile 1 Juillet 2006
logiciel de stats performant Administration d'un site Web 23 Mars 2006
[recherche] Hebergement mail ultra performant Administration d'un site Web 5 Décembre 2005
Référencement performant de phpbb Référencement Google 29 Novembre 2005