par
Hubert Roksor » 18 avr. 2006, 16:56
Je viens de regarder un peu mieux les requêtes en question et... j'ai bien peur qu'on ne puisse pas faire grand-chose. On pourrait accélérer la requête "unanswered" avec un index spécial comme:
Code : Tout sélectionner
ALTER TABLE phpbb_topics ADD INDEX unanswered (topic_moved_id, topic_replies, forum_id)
mais la requête n'est pas particulièrement lente (~15ms). Les "egosearch" et "newposts" sont un peu plus délicats. Là non plus les requêtes ne sont pas particulièrement lentes mais elles peuvent être très très longues, et là je parle de leur syntaxe. Elles utilisent toutes deux une ou plusieurs requêtes de type:
Code : Tout sélectionner
SELECT post_id
FROM phpbb_posts
WHERE poster_id = 123;
SELECT ...
FROM ...
WHERE post_id IN (1, 2, 3, 4, 5, 6, ...)
Donc plus la première requête renvoit de post_ids et plus la seconde requête est longue. Et j'ai souvent remarqué que MySQL n'aimait pas trop les trop longues requêtes.
Ça explique aussi pourquoi je n'ai jamais souffert de cette fameuse page blanche, parce que je visite souvent les forums donc il n'y a que peu de nouveaux posts, et je n'ai pas beaucoup de posts à mon actif donc la requête de l'egosearch est plus courte. Demandez un peu à Cyrano de faire un egosearch pour voir
On pourrait essayer de changer la seconde requête pour utiliser une sous-requête et/ou une table dérivée. Ou même une table temporaire en fait. J'essaierai d'y réfléchir lorsque j'aurai quelques minutes

Je viens de regarder un peu mieux les requêtes en question et... j'ai bien peur qu'on ne puisse pas faire grand-chose. On pourrait accélérer la requête "unanswered" avec un index spécial comme:
[code]ALTER TABLE phpbb_topics ADD INDEX unanswered (topic_moved_id, topic_replies, forum_id)[/code]
mais la requête n'est pas particulièrement lente (~15ms). Les "egosearch" et "newposts" sont un peu plus délicats. Là non plus les requêtes ne sont pas particulièrement lentes mais elles peuvent être très très longues, et là je parle de leur syntaxe. Elles utilisent toutes deux une ou plusieurs requêtes de type:
[code]SELECT post_id
FROM phpbb_posts
WHERE poster_id = 123;
SELECT ...
FROM ...
WHERE post_id IN (1, 2, 3, 4, 5, 6, ...)[/code]
Donc plus la première requête renvoit de post_ids et plus la seconde requête est longue. Et j'ai souvent remarqué que MySQL n'aimait pas trop les trop longues requêtes.
Ça explique aussi pourquoi je n'ai jamais souffert de cette fameuse page blanche, parce que je visite souvent les forums donc il n'y a que peu de nouveaux posts, et je n'ai pas beaucoup de posts à mon actif donc la requête de l'egosearch est plus courte. Demandez un peu à Cyrano de faire un egosearch pour voir :lol:
On pourrait essayer de changer la seconde requête pour utiliser une sous-requête et/ou une table dérivée. Ou même une table temporaire en fait. J'essaierai d'y réfléchir lorsque j'aurai quelques minutes ;)