Réduire le nombre de requêtes sql

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par sff, 6 Décembre 2008.

  1. sff
    sff WRInaute impliqué
    Inscrit:
    2 Février 2005
    Messages:
    533
    J'aime reçus:
    0
    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:
    //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:
    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.
     
  2. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 226
    J'aime reçus:
    0
    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 :/
     
  3. sff
    sff WRInaute impliqué
    Inscrit:
    2 Février 2005
    Messages:
    533
    J'aime reçus:
    0
    suite

    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.
     
  4. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 226
    J'aime reçus:
    0
    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 :)
     
  5. sff
    sff WRInaute impliqué
    Inscrit:
    2 Février 2005
    Messages:
    533
    J'aime reçus:
    0
    suite

    Non ca changera pas le nombre de requête. Ca sera toujours aussi lourd.
     
  6. sff
    sff WRInaute impliqué
    Inscrit:
    2 Février 2005
    Messages:
    533
    J'aime reçus:
    0
    suite

    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.
     
  7. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 226
    J'aime reçus:
    0
    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 :)
     
Chargement...
Similar Threads - Réduire nombre requêtes Forum Date
Comment réduire durée de vie du cookie GTM ? Administration d'un site Web 19 Avril 2021
Campagne Google Ads : mettre en veille ou réduire le budget ? AdWords 19 Avril 2020
Réduire une condition js Développement d'un site Web ou d'une appli mobile 22 Mars 2020
Réduire et optimiser un code js Développement d'un site Web ou d'une appli mobile 16 Mars 2020
WordPress Réduire un espacement sur twenty seventeen Développement d'un site Web ou d'une appli mobile 17 Février 2020
Réduire sa dépendance à Google Le café de WebRankInfo 22 Mai 2019
WORDPRESS Woocommerce, vos astuces pour réduire CPU usage et serveur stress ? e-commerce 22 Juin 2018
Est ce que je peux réduire ce code ? Développement d'un site Web ou d'une appli mobile 4 Avril 2017
Réduire un bout de code Développement d'un site Web ou d'une appli mobile 5 Février 2017
Reduire et optimiser une requete sql Développement d'un site Web ou d'une appli mobile 8 Décembre 2016
Reduire des lignes de code php Développement d'un site Web ou d'une appli mobile 5 Novembre 2016
Réduire le taux de rebond d'un site d'une école Débuter en référencement 29 Mai 2015
Réduire le temps de chargement d'une page Développement d'un site Web ou d'une appli mobile 20 Mars 2015
réduire le poid d'une photo ( logiciel gratuit ) Développement d'un site Web ou d'une appli mobile 30 Janvier 2015
Réduire le temps de chargement - Besoin d'aide Développement d'un site Web ou d'une appli mobile 11 Août 2014
Réduire le temps de chargement d'un site. Développement d'un site Web ou d'une appli mobile 4 Septembre 2011
Les meilleures pratiques pour réduire le taux de rebond Débuter en référencement 20 Avril 2010
Reduire la taille de ma BDD Administration d'un site Web 4 Avril 2010
Les fondateurs de Google veulent réduire leur part dans le capital Google : l'entreprise, les sites web, les services 23 Janvier 2010
Google PowerMeter : pour réduire sa consommation électrique Google : l'entreprise, les sites web, les services 13 Février 2009