Salut
J'essaye en ce moment de bosser un peu l'optimisation à mon humble niveau et je dois avouer que je galère un peu. J'ai remplie ma base de données d'un nombre significatifs d’enregistrements qu'il s'aggisse de faux articles de faux membres etc. pour effectuer les tests, et à chacune de mes requêtes je vérifie via EXPLAIN et je vérifie le temps d'exécution ceci afin de déterminer ce qui doit être optimisé (ajout d'index, modification des requêtes etc.).
Une des requêtes qui me pose généralement un soucis c'est celle où je dois utiliser des count(*) pour la pagination.
Exemple, voici les tables
TABLE : t_bloc // bloc=article
id_bloc
titre
id_membre_bloc (<-- indique l'id du membre qui a posté l'article, 0 si il s'agit d'un article posté par moi même)
...
(dans mon test il y a 120 000 enregistrements dans cette table)
TABLE : t_taxon_bloc //table qui relie les rubrique et les articles (table de relation)
id_taxon
id_bloc
(dans mon test il y a 120 000 enregistrements dans cette table)
TABLE : t_taxon // dans mon exemple ci dessous je n'aurais pas besoin de faire de jointure avec cette table
id_taxon
taxon (<-- nom de la rubrique)
Voici la requête :
Pour résumer je cherche à compter le nombre d'articles publiés par le membre 8 dans la rubrique 44. reuqête qui me semble pourtant des plus simples et difficilement optimisable :/
Dans mon test le count retourne 60 000 enregistrements sur les 120 000 articles postés (les 60000 autres n'étant pas postés par ce membre)
Mon soucis c'est que la requête met 0,85s pour s’exécuter, autant dire une éternité pour ce type de requête et le peu enregistrement
Voici la gueule de mon explain :
Résultat :
id_taxon, id_bloc et id_membre_bloc sont évidemment des index :wink:
Comment éviter éventuellement ces foutus count pour gérer la pagination? Quand il n'y a pas de jointure ca va assez vite mais avec une jointure ça devient très gourmand :/
J'essaye en ce moment de bosser un peu l'optimisation à mon humble niveau et je dois avouer que je galère un peu. J'ai remplie ma base de données d'un nombre significatifs d’enregistrements qu'il s'aggisse de faux articles de faux membres etc. pour effectuer les tests, et à chacune de mes requêtes je vérifie via EXPLAIN et je vérifie le temps d'exécution ceci afin de déterminer ce qui doit être optimisé (ajout d'index, modification des requêtes etc.).
Une des requêtes qui me pose généralement un soucis c'est celle où je dois utiliser des count(*) pour la pagination.
Exemple, voici les tables
TABLE : t_bloc // bloc=article
id_bloc
titre
id_membre_bloc (<-- indique l'id du membre qui a posté l'article, 0 si il s'agit d'un article posté par moi même)
...
(dans mon test il y a 120 000 enregistrements dans cette table)
TABLE : t_taxon_bloc //table qui relie les rubrique et les articles (table de relation)
id_taxon
id_bloc
(dans mon test il y a 120 000 enregistrements dans cette table)
TABLE : t_taxon // dans mon exemple ci dessous je n'aurais pas besoin de faire de jointure avec cette table
id_taxon
taxon (<-- nom de la rubrique)
Voici la requête :
Code:
SELECT count(*) AS nb_blocs
FROM t_bloc B
INNER JOIN t_taxon_bloc TB
ON (B.id_bloc=TB.id_bloc)
WHERE TB.id_taxon=44
AND B.id_membre_bloc=8
Pour résumer je cherche à compter le nombre d'articles publiés par le membre 8 dans la rubrique 44. reuqête qui me semble pourtant des plus simples et difficilement optimisable :/
Dans mon test le count retourne 60 000 enregistrements sur les 120 000 articles postés (les 60000 autres n'étant pas postés par ce membre)
Mon soucis c'est que la requête met 0,85s pour s’exécuter, autant dire une éternité pour ce type de requête et le peu enregistrement
Voici la gueule de mon explain :
Code:
EXPLAIN SELECT count( * ) AS nb_blocs
FROM t_bloc B
INNER JOIN t_taxon_bloc TB ON ( B.id_bloc = TB.id_bloc )
WHERE TB.id_taxon =44
AND B.id_membre_bloc =8
Résultat :
Code:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE B ref PRIMARY,id_membre_bloc id_membre_bloc 4 const 60052
1 SIMPLE TB eq_ref PRIMARY PRIMARY 8 const,B.id_bloc 1 Using index
id_taxon, id_bloc et id_membre_bloc sont évidemment des index :wink:
Comment éviter éventuellement ces foutus count pour gérer la pagination? Quand il n'y a pas de jointure ca va assez vite mais avec une jointure ça devient très gourmand :/