par
caroube » 02 avr. 2008, 10:30
Il est complètement absurde d'utiliser select * et mysql_num_rows() pour connaître le nombre de lignes d'une table. En effet, imaginons que ta table contienne 500.000 lignes avec chaque champ qui fait 1000 octets (un id, nom, un prénom, une adresse, un numéro de téléphone ...).
Lorsqu'il reçoit "select * from ...", le moteur de base de données va lire toutes ces informations dans la base et les stocker en mémoire du serveur en attendant qu'elles soient récupérées par le programme PHP : donc grosso modo 470 Mo de lecture dans la base, 470 Mo d'écriture dans la mémoire du serveur et 470 Mo de stockage dans un tableau temporaire pour ne se servir que d'une seule valeur : le nombre de lignes du tableau.
Amélioration 1 : Si tu tiens absolument à mysql_num_rows, fais select
id from ... Au moins tu passeras de 470 Mo de lecture/écriture/stockage à 3 Mo (un id en INT est sur 7 octets).
Amélioration 2 : Ensuite, oui, il faut bien faire un select count (*). Parce que toute base de données normalement constituée stocke quelque part le nombre de lignes de chaque table. Ou alors, parcours rapidement la table (ou un index) et incrémente un compteur. Il n'y a donc aucune lecture du contenu de la table et la valeur retournée et mise à disposition de PHP est un simple nombre. On passe donc de 470 Mo à 7 octets. Ca vaut le coup d'un peu creuser la manière de récupérer le select count (*), non ?
mysql_connect("localhost", "root", "");
mysql_select_db("mabase"); // Sélection de la base mabase
$reponse = mysql_query("SELECT count(*) FROM abonne"); // Requête SQL
$donnees = mysql_result($reponse, 0);
echo "La table comporte ".$donnees." enregistrement(s).";
mysql_close(); // Déconnexion de MySQL
Note 1 : laisse tomber les ` autour du nom des tables ou des champs.
Note 2 :
Code : Tout sélectionner
Fatal error: Call to undefined function mysql_fetch_rows() in C:\wamp\www\test.php on line 17
Lit bien
la doc ici pour voir pourquoi mysql_fetch_rows n'existe pas
Note 3 :
Code : Tout sélectionner
Warning: Wrong parameter count for mysql_result() in C:\wamp\www\test.php on line 17
Lit bien
la doc ici pour voir pourquoi il n'y a pas le bon nombre de paramètres à mysql_result
Il est complètement absurde d'utiliser select * et mysql_num_rows() pour connaître le nombre de lignes d'une table. En effet, imaginons que ta table contienne 500.000 lignes avec chaque champ qui fait 1000 octets (un id, nom, un prénom, une adresse, un numéro de téléphone ...).
Lorsqu'il reçoit "select * from ...", le moteur de base de données va lire toutes ces informations dans la base et les stocker en mémoire du serveur en attendant qu'elles soient récupérées par le programme PHP : donc grosso modo 470 Mo de lecture dans la base, 470 Mo d'écriture dans la mémoire du serveur et 470 Mo de stockage dans un tableau temporaire pour ne se servir que d'une seule valeur : le nombre de lignes du tableau.
[b]Amélioration 1 :[/b] Si tu tiens absolument à mysql_num_rows, fais select [b]id[/b] from ... Au moins tu passeras de 470 Mo de lecture/écriture/stockage à 3 Mo (un id en INT est sur 7 octets).
[b]Amélioration 2 :[/b] Ensuite, oui, il faut bien faire un select count (*). Parce que toute base de données normalement constituée stocke quelque part le nombre de lignes de chaque table. Ou alors, parcours rapidement la table (ou un index) et incrémente un compteur. Il n'y a donc aucune lecture du contenu de la table et la valeur retournée et mise à disposition de PHP est un simple nombre. On passe donc de 470 Mo à 7 octets. Ca vaut le coup d'un peu creuser la manière de récupérer le select count (*), non ?
[php]
mysql_connect("localhost", "root", "");
mysql_select_db("mabase"); // Sélection de la base mabase
$reponse = mysql_query("SELECT count(*) FROM abonne"); // Requête SQL
$donnees = mysql_result($reponse, 0);
echo "La table comporte ".$donnees." enregistrement(s).";
mysql_close(); // Déconnexion de MySQL
[/php]
Note 1 : laisse tomber les ` autour du nom des tables ou des champs.
Note 2 :
[quote]
[code]Fatal error: Call to undefined function mysql_fetch_rows() in C:\wamp\www\test.php on line 17 [/code]
[/quote]
Lit bien [url=http://fr.php.net/manual/fr/function.mysql-fetch-row.php]la doc ici[/url] pour voir pourquoi mysql_fetch_rows n'existe pas
Note 3 :
[quote]
[code]Warning: Wrong parameter count for mysql_result() in C:\wamp\www\test.php on line 17[/code]
[/quote]
Lit bien [url=http://fr.php.net/manual/fr/function.mysql-result.php]la doc ici[/url] pour voir pourquoi il n'y a pas le bon nombre de paramètres à mysql_result