+/- rapide en php et mysql

WRInaute discret
Bonsoir
Ma question n'est pas essentielle, mais laquelle de ces 3 formes est la plus efficace en terme d'accès BD et rapidité ?

1.
commande globale :
echo mysql_num_rows(mysql_query("SELECT ...))." liens dans ".mysql_num_rows(mysql_query("SELECT ...))." catégories et ".mysql_num_rows(mysql_query("SELECT ...))." sous-catégories";

2.
ou avec utilisation de variables :
$1=mysql_num_rows(mysql_query("SELECT ...));
$2=mysql_num_rows(mysql_query("SELECT ...));
$3=mysql_num_rows(mysql_query("SELECT ...));
echo $1." liens dans ".$2." catégories et ".$3." sous-catégories";

3.
ou avec utilisation de variables et décomposition commandes mysql :
$1=mysql_query("SELECT ...);
$1=mysql_num_rows($1);
$2=mysql_query("SELECT ...);
$2=mysql_num_rows($2);
$3=mysql_query("SELECT ...);
$3=mysql_num_rows($3);
echo $1." liens dans ".$2." catégories et ".$3." sous-catégories";
 
WRInaute accro
Ni l'une ou l'autre de ces méthodes. SI l'objectif est juste de faire un cout, pourquoi ne pas utiliser l'opérateur sql COUNT plutôt ?
 
WRInaute discret
OK merci à tous les 2
Je pensais qu'utiliser plus de variables était plus gourmand en ressources même si de façon minime
à bientôt pour d'autres interrogations !
 
WRInaute passionné
C'est pas 6 variables à la place de 3 qui vont te bouffer du temps et de la conso serveur ^^

Par contre, ne pas utiliser COUNT, ça te coûtera de 5 à 50 fois plus de temps et ressources serveur.

C'est toujours la même chose, on cherche à économiser sur des broutilles alors qu'on réalise de monumentales erreurs à côté ^^ (ne t'inquiète pas, ça arrive à tout le monde)

Perso, le nombre de variables, je m'en cogne complètement, s'il faut en utiliser pour un développement plus clair, je ne vais pas me gêner, et c'est pas les minimes économies générées qui peuvent rivaliser avec ce qu'elles apportent.
 
WRInaute discret
Bonjour
Je vous ai entendu et adopté le count de la manière suivante :
Code:
$liens = mysql_fetch_array(mysql_query("SELECT COUNT(compteur) FROM sites WHERE valid=1",$db));
$categories = mysql_fetch_array(mysql_query("SELECT COUNT(compteur) FROM cat WHERE bigcat=1",$db));
$souscategories = mysql_fetch_array(mysql_query("SELECT COUNT(compteur) FROM cat WHERE bigcat=0",$db));
echo "<b>Cet annuaire contient ";
echo $liens[0]." liens in ".$categories[0]." catégories and ".$souscategories[0]." sous-catégories";
Ce qui donne : Cet annuaire contient 9794 liens dans 153 catégories et 826 sous-catégories
L'élève a-t-il bien travaillé ?
 
WRInaute passionné
Tu peux économiser un peu de RAM en utilisant mysql_fetch_rows plutôt que le array (qui retourne "clé" + "index") ça fait 3 variables en moins à utiliser (bon là c'est minime).

Bon, par contre ta solution est bien si tu fais des "count" sur peu d'enregistrement.
Lorsque ton site grossira tu devras utiliser une autre méthode.
Je te suggère d'utiliser une table "stat" avec 3 colonnes (sites, cat_1, cat_0).
Quand tu fais tes INSERT tu UPDATE cette table avec + 1.
Après ça te fait un simple SELECT * FROM stat;
Là tu vas gagner énormément ;)
Pour mettre à jour cette table en une seule étape:
Code:
UPDATE stat SET sites = (SELECT COUNT(compteur) FROM sites WHERE valid=1);
 
WRInaute discret
Bonjour, comme je ne vois pas le contenu de tes tables, je vais te donner une idée qui serait à tester. Cependant, selon moi tout devrait être possible. Si tu es à l'aise avec les requêtes MySQL, il serait probablement possible de faire 3 sous requêtes dans ta requête. Par exemple
Code:
SELECT id, (SELECT COUNT(id) FROM table) AS total1,  (SELECT COUNT(id) FROM table2) AS total2,  (SELECT COUNT(id) FROM table3) AS total3 FROM table LIMIT 1
. Selon moi avec quelques tests, peut-être que cela est possible...
 
WRInaute discret
Bonjour
>>> Julia41
Je retiens l'idée d'une table "compteur" (en fait j'en utilise déjà 1 pour compter les visites par site).
Mais ne l'utiliserai pas.
C'est moi, principalement, qui remplit la BD et utilise tantôt un formulaire, tantôt entrée directe dans phpmyadmin, de même pour l'admin, d'où des risques d'oubli.

>>> enzoci
A l'aise, non, me débrouille et fais souvent des recherches d'exemple
Sous-requêtes : oui, possible, mais garde ma solution pour plus de clarté

Ma BD ne dépassera jamais quelques milliers d'enregistrements et je pinaille pour peu de choses sinon apprendre, j'ai encore quelques num_rows à changer en count et là, sans faire de test précis, mais à vue de nez, ça semble faire gagner un peu de temps.

Merci à tous
 
WRInaute passionné
C'est moi, principalement, qui remplit la BD et utilise tantôt un formulaire, tantôt entrée directe dans phpmyadmin, de même pour l'admin, d'où des risques d'oubli.
Par le script d'admin tu peux ajouter à la main.
Par contre, ce que tu peux faire en "mieux" serait un simple script .php que tu éxecutes par cron (si tu le peux, sinon à la main) faisant les calculs:
Code:
UPDATE stats SET sites = (SELECT COUNT(..)), cat = (SELECT ...);
Voilà la fonction que j'utilise pour faire ce que tu fais :
Code:
function get_row_count($table, $suffix = ''){
	global $DB;
	if ($suffix) {
		$suffix = ' ' . $suffix;
	}
	$DB->query('SELECT COUNT(*) FROM ' . $table . $suffix);
	list($a) = $DB->next_record();
	$DB->close();
	return $a;
}

Là la même avec du memcache :
Code:
function uniq_count_row($table, $suffix = '', $key, $ttl = '') {
	global $Cache, $DB;
	if (isset($suffix)) {
		$suffix = ' ' . $suffix;
	}
	if (!isset($ttl)) {
		$ttl = 120;
	}
	if ($Cache->get_value($key) === false) {
		$DB->query('SELECT COUNT(*) FROM ' . $table . $suffix);
		list($a) = $DB->next_record();
		$DB->close();
		$Cache->cache_value($key, $a, $ttl);
	}
	$a = $Cache->get_value($key);
	return $a;
}
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut