Réduire le nombre de requêtes sql

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 281
Inscription: Mer Fév 02, 2005 23:04

Réduire le nombre de requêtes sql

Message le Sam Déc 06, 2008 18:21

Bonjour, je pose cette question ici parce que je ne sais vraiment plus quoi faire. C'est un problème qui traine depuis plus de 6 mois et personne n'a vraiment réussi à m'aider, moi même je n'y arrive pas.

Le but est pour simple, il faudrait réduire le nombre de requêtes dans le code ci-dessous car il y en a beaucoup trop.

Code: Tout sélectionner
//Récupération élément décors.
   $mapquery = doquery("SELECT longitude, latitude, pic, land FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "map");
   
   while ($maprow = mysql_fetch_assoc($mapquery)) {   
      
      if (empty($TabMAP1[$maprow['longitude']][$maprow['latitude']]))
      $TabMAP1[$maprow['longitude']][$maprow['latitude']] = $maprow['pic'];

   }   
   mysql_free_result($mapquery);
   
   
   //Récupération élément clans.
   $clanquery = doquery("SELECT pic, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "clans_elements");
   
   while ($clanrow = mysql_fetch_assoc($clanquery)) {
      
      if (empty($TabMAP7[$clanrow['longitude']][$clanrow['latitude']]))
      $TabMAP7[$clanrow['longitude']][$clanrow['latitude']] = $clanrow['pic'];
   }
   mysql_free_result($clanquery);
   
   
   //Récupération élément villes.
   $townquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "towns");
   
   while ($townrow = mysql_fetch_assoc($townquery)) {
      
      if (empty($TabMAP2[$townrow['longitude']][$townrow['latitude']]))
      $TabMAP2[$townrow['longitude']][$townrow['latitude']] = $townrow['name'];
   }
   mysql_free_result($townquery);
   
   
   //Récupération élément points de téléportations.
   $teleportationquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "teleportations");
   
   while ($teleportationrow = mysql_fetch_assoc($teleportationquery)) {
      
      if (empty($TabMAP9[$teleportationrow['longitude']][$teleportationrow['latitude']]))
      $TabMAP9[$teleportationrow['longitude']][$teleportationrow['latitude']] = $teleportationrow['name'];
   }
   mysql_free_result($teleportationquery);
   
   
   //Récupération élément bureaux des colis.
   $officequery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "packages_offices");
   
   while ($officerow = mysql_fetch_assoc($officequery)) {
      
      if (empty($TabMAP8[$officerow['longitude']][$officerow['latitude']]))
      $TabMAP8[$officerow['longitude']][$officerow['latitude']] = $officerow['name'];
   }
   mysql_free_result($officequery);
   
   
   //Récupération élément coffres.
   $cofferquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "coffers");
   
   while ($cofferrow = mysql_fetch_assoc($cofferquery)) {
      
      if (empty($TabMAP5[$cofferrow['longitude']][$cofferrow['latitude']]))
      $TabMAP5[$cofferrow['longitude']][$cofferrow['latitude']] = $cofferrow['name'];
   }
   mysql_free_result($cofferquery);
   
   
   //Récupération élément arènes.
   $arenaquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "arenas");
   
   while ($arenarow = mysql_fetch_assoc($arenaquery)) {
      
      if (empty($TabMAP6[$arenarow['longitude']][$arenarow['latitude']]))
      $TabMAP6[$arenarow['longitude']][$arenarow['latitude']] = $arenarow['name'];
   }
   mysql_free_result($arenaquery);


Sinon il y a la fonction doquery pour ceux qui veulent plus de précisions :
Code: Tout sélectionner
function doquery($query, $table) {
   include('config.php');
   $sqlquery = mysql_query(str_replace("{{table}}", $dbsettings["prefix"] . "_" . $table, $query)) or die(mysql_error());
   return $sqlquery;
}


La page complète est dispo ici : http://www.rpgillusion.net/game/map.txt

Voila si quelqu'un si pouvait m'aider, je lui serais vraiment reconnaissant.


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3062
Inscription: Jeu Sep 14, 2006 4:53

Message le Sam Déc 06, 2008 18:32

Encore une fois, cette question ne se serait pas posée si tu avais pris le temps d'analyser le projet et la structure des tables à utiliser.

Quand tu programmes un truc, faut avoir en permanence à l'esprit qu'il faut éviter les doublons et être le plus générique possibles. C'est quasiment que des copiés collés dans ton cas donc ça se voit qu'il y a un problème non ?

2 tables auraient suffit: ELEMENTS et TYPES pour faire tout ça en une seule requête avec une jointure. Là on peut rien faire désolé. Et rafistoler un truc qui ne tient pas debout ça n'a pas de sens :/


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 281
Inscription: Mer Fév 02, 2005 23:04

suite

Message le Sam Déc 06, 2008 19:04

YoyoS je comprends ta réflexion et je serais totalement d'accords si chaque table comprenait 3 ou 4 champs sql maximum, ca aurait été plus simple de tout combiner, mais la chaque table contient entre 10 et 20 champs chacune, ca devient impossible à combiner.


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3062
Inscription: Jeu Sep 14, 2006 4:53

Message le Sam Déc 06, 2008 19:34

Donc il n'y a pas moyen de faire moins de requêtes alors. Peut-être faire un tableau (array) avec les noms des tables et boucler dessus en faisant la même requête, mais ça ne change rien au nombre de requêtes. C'est pas normal que tes tables fassent 20 colonnes. Je veux bien te faire une analyse vite fait si tu me fais une description complète de toute ta base, tes tables et tes champs actuels :)


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 281
Inscription: Mer Fév 02, 2005 23:04

suite

Message le Sam Déc 06, 2008 19:35

Non ca changera pas le nombre de requête. Ca sera toujours aussi lourd.


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 281
Inscription: Mer Fév 02, 2005 23:04

suite

Message le Sam Déc 06, 2008 20:10

Je peux te montrer la structure de quelques tables :

map :

`id` smallint(5) unsigned NOT NULL auto_increment,
`pic` tinyint(3) unsigned NOT NULL default '0',
`longitude` smallint(6) NOT NULL default '0',
`latitude` smallint(6) NOT NULL default '0',
`open` tinyint(3) unsigned NOT NULL default '1',
`land` tinyint(3) unsigned NOT NULL default '1',

towns :

`id` tinyint(3) unsigned NOT NULL auto_increment,
`name` varchar(30) NOT NULL default '',
`latitude` smallint(6) NOT NULL default '0',
`longitude` smallint(6) NOT NULL default '0',
`innprice` tinyint(4) NOT NULL default '0',
`parchmentprice` tinyint(3) NOT NULL default '0',
`parchmentcoffers` tinyint(3) NOT NULL default '0',
`total_buy` int(11) NOT NULL default '0',
`travelpoints` smallint(5) unsigned NOT NULL default '0',
`equipslist` text NOT NULL,
`itemslist` text NOT NULL,
`hidden` tinyint(3) NOT NULL default '0',
`coords_map1`varchar(50) NOT NULL default '',
`coords_map2`varchar(50) NOT NULL default '',
`coords_map3`varchar(50) NOT NULL default '',
`coords_map4`varchar(50) NOT NULL default '',
`coords_map5`varchar(50) NOT NULL default '',
`coords_map6`varchar(50) NOT NULL default '',

package offices :

`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(30) NOT NULL default '',
`latitude` smallint(6) NOT NULL default '0',
`longitude` smallint(6) NOT NULL default '0',
`travelpoints` int(11) NOT NULL default '0',
`parchmentprice` int(11) NOT NULL default '0',

clans elements :

`id` tinyint(3) unsigned NOT NULL auto_increment,
`latitude` smallint(6) NOT NULL default '0',
`longitude` smallint(6) NOT NULL default '0',
`clan` int(11) NOT NULL default '0',
`pic` varchar(30) NOT NULL default '',
`type` smallint(6) NOT NULL default '0',

coffers :

`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(30) NOT NULL default '',
`latitude` smallint(6) NOT NULL default '0',
`longitude` smallint(6) NOT NULL default '0',
`parchmentprice` int(11) NOT NULL default '0',
`total_buy` int(11) NOT NULL default '0',
`travelpoints` int(11) NOT NULL default '0',
`total` int(11) NOT NULL default '0',
`limit_d` int(11) NOT NULL default '0',
`total_d` int(11) NOT NULL default '0',
`total_r` int(11) NOT NULL default '0',


Mais je doute que tu sois avancé avec ca.


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3062
Inscription: Jeu Sep 14, 2006 4:53

Message le Sam Déc 06, 2008 20:17

En effet c'est pas assez, c'est surtout intéressant de voir la ou les données sont souvent dupliquées pour optimiser correctement :)


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :

  • Calcul du nombre de backlinks
    Cet outil vous permet d'analyser en détails la "popularité" de votre site sur Google. En plus du nombre de liens pris en compte par Google, il calcule le pourcentage de liens internes parmi tous les liens, et il affiche les premières URL trouvées.
  • Analyseur de densité
    Cet outil vous permet de calculer l'indice de densité d'un mot-clé d'une page web. Il est calculé à la fois pour la balise TITLE, la balise META description et l'ensemble du texte de la page.


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités