Pour le premier billet sur un sujet technique, j'ai décidé de parler d'algorithme au travers d'un exemple de script utilisant MySQL : un forum sans LIMIT. Pour comprendre cet article il est important d'avoir quelques notions de SQL.
La plupart des forums actuels utilisant le couple PHP/MySQL repose sur le même principe, une liste de forums, puis une liste de sujets et enfin les messages à proprement parlés. La majorité des forums utilisent une requête avec la clause LIMIT afin de tronquer les résultats de la requête pour ne prendre que les sujets de la page 1 par exemple. Cela reste assez facile à coder et à entretenir mais si le forum commence à grossir, les requêtes de sélection de sujets et des messages vont devenir de plus en plus lentes à cause de ce fameux LIMIT étant donné que ce dernier tronque les résultats obtenus par les différentes conditions de WHERE. Donc si dans un de vos forums il y a 10 000 sujets de discussions, vous allez à chaque requête récupérer les infos pour ces 10 000 sujets puis n'en garder qu'un tout petit morceau (par exemple les infos des 30 sujets de la page 1). Et pour couronner le tout ce fameux LIMIT va réorganiser les lignes sélectionnés avant de n'en garder qu'une toute petite partie.
Vous l'avez bien compris, utilisez un LIMIT dans une requête peut provoquer à la longue de forts ralentissements. mais je vous rassure tout de suite, il faut avoir un nombre conséquent de sujets et de messages avant de commencer à ressentir les effets du LIMIT. Le site du Zéro l'a ressentit et c'est pour cela qu'il utilise maintenant un forum sans LIMIT. Mais il est aussi très intéressant d'essayer de coder un forum sans ce LIMIT, et c'est ce dont je vais vous parler maintenant.
Plus de LIMIT : utilisation de BETWEEN
Si je vous propose de ne plus utiliser le LIMIT, il faut bien que vous aillez autre chose à utiliser à la place, et ce produit miracle c'est la clause BETWEEN qui, utilisée conjointement avec WHERE (on pourrait bien sûr le faire autrement mais avec BETWEEN c'est le plus lisible à mon sens), permettra de ne sélectionner que les informations nécessaires plus rapidement qu'en utilisant LIMIT.
Le secret, c'est d'attribuer à chaque topic un numéro qui correspond à sa place dans la liste des forums, et après la requête devient magique puisqu'il suffit simplement de de demander les topics dont le numéro est compris entre 1 et 30 pour la page 1, 31 et 60 pour la page 2, etc. Mais vous allez alors me demander pourquoi c'est si dur de coder un forum avec cet algo, eh bien tout simplement car à chaque fois qu'une réponse est posté, qu'un sujet est créé, qu'un sujet est supprimé, etc il faut réorganiser les numéros de topic, et c'est là qu'est toute la complexité d'un tel forum, chaque action sur un topic nécessite de bien s'y prendre pour pas que la liste des topics soit sans dessus-dessous, le fameux bug des post-it qui se baladent en est l'exemple le plus flagrant.
Bien que mon forum n'en ait nullement besoin, je l'ai tout de même mis en application tout d'abord pour le plaisir de coder, puis dans l'éventualité de redistribuer ce forum car à ce jour le seul forum utilisant ce principe des numéros de topic est le forum MesDiscussions.net mais son prix est horriblement cher.
Pour conclure : ce type de forum est assez dur à coder mais une fois lancé ce n'est que du bonheur, pour peu qu'on utilise les requêtes préparées, les transactions et les procédures stockées alors là les performances et la fiabilité s'envolent.
2