par
caroube » 23 oct. 2008, 11:21
Une requête, c'est un trou noir. Entre le moment où tu déclenches la requête et celui où tu récupères le résultat, tu n'as plus la main.
La "longueur" d'exécution de ta requête peut se situer à plusieurs niveaux :
1) au niveau de la clause Where qui n'est pas optimisée avec les jointures, les index, ...
2) au niveau de la constitution du resultset qui peut comporter énormément de données : nombreux champs avec des valeurs très longues.
3) au niveau de la transmission de ce resultset entre le serveur et le poste client
Exemple : une base de données d'images avec beaucoup d'images. La requête peut-être très simple (un simple select sans where), mais si tes images sont dans la base, le niveau 2 de constitution du resultset peut-être très long. Ou si c'est uniquement le path des images qui est dans la base, à ce moment-là, ça peut être le niveau 3 de transmission qui peut être très longue.
Le problème du numrows, c'est que tu ne sais pas si la lenteur provient du niveau 1 ou 2.
Donc question : est-ce que si tu fais une requête select count(*) ... avec la même clause where, est-ce que c'est rapide ou pas ? Si non, il faut optimiser cette clause where ; si oui tu peux donc imaginer un système en deux temps ou trois temps selon le cas :
1) page 1 : tu fais le compte, sans utiliser le num_rows, mais en utilisant une requête select count(*) ... avec la même clause where que la requête de sélection.
2) si le compte est acceptable, tu envoies automatiquement sur la page 2 qui fait la requête et l'affichage (header ('location: ...')
3) sinon, tu envoies un "confirm" qui enverra sur la page 2 si l'utilisateur le choisit
Une requête, c'est un trou noir. Entre le moment où tu déclenches la requête et celui où tu récupères le résultat, tu n'as plus la main.
La "longueur" d'exécution de ta requête peut se situer à plusieurs niveaux :
1) au niveau de la clause Where qui n'est pas optimisée avec les jointures, les index, ...
2) au niveau de la constitution du resultset qui peut comporter énormément de données : nombreux champs avec des valeurs très longues.
3) au niveau de la transmission de ce resultset entre le serveur et le poste client
Exemple : une base de données d'images avec beaucoup d'images. La requête peut-être très simple (un simple select sans where), mais si tes images sont dans la base, le niveau 2 de constitution du resultset peut-être très long. Ou si c'est uniquement le path des images qui est dans la base, à ce moment-là, ça peut être le niveau 3 de transmission qui peut être très longue.
Le problème du numrows, c'est que tu ne sais pas si la lenteur provient du niveau 1 ou 2.
Donc question : est-ce que si tu fais une requête select count(*) ... avec la même clause where, est-ce que c'est rapide ou pas ? Si non, il faut optimiser cette clause where ; si oui tu peux donc imaginer un système en deux temps ou trois temps selon le cas :
1) page 1 : tu fais le compte, [b]sans utiliser le num_rows[/b], mais en utilisant une requête select count(*) ... avec la même clause where que la requête de sélection.
2) si le compte est acceptable, tu envoies automatiquement sur la page 2 qui fait la requête et l'affichage (header ('location: ...')
3) sinon, tu envoies un "confirm" qui enverra sur la page 2 si l'utilisateur le choisit