La FAQ MySQL - commentaires & suggestions
La FAQ MySQL a subi un gros lifting : passage au format standard Développez.com, ajout de plus de 50 questions/réponses ; elle est désormais disponible à l'adresse : http://mysql.developpez.com/faq/.
J'ai également le plaisir de remplacer Florian en tant que responsable de la FAQ, contactez-moi pour toute question, suggestion, critique...
Les nouvelles Q/R ont été conçues à partir des questions fréquemment posées sur le forum ; nous espérons ainsi que cette FAQ répondra à vos problèmes les plus courants.
D'autre part n'hésitez pas à poster vos propositions de Questions avec les réponses dans cette enfilade, vous pourrez de cette manière contribuer à son évolution.
Dernier enregistrement d'une table
Encore une petite proposition :
J'avais chercher sur le forum et sur la faq comment réccupérer le dernier enregistrement inséré, et je n'ai pas trouvé ce que je cherchais...
Voici ma méthode, qui peux parfois être pratique dans certains cas, le mien est tordu, je dois l'admettre, mais elle peut être utile sur la faq :
J'ai une base de donnée qui contient une clée primaire de référence de livre.
Les enregistrements ne se suivent pas tous et il y a plusieurs catégories de livres.
certains ont leur référence qui est comprise entre 0 et 200000 d'autre entre 300000 et 400000. ect...
Ce n'est pas super, mais cela permet d'identifier rapidement la catégorie du livre selon la référence.
Il n'y a pas d'AUTO_INCREMENT dans ma table, car il faut parfois saisir des livres dans une catégorie, et parfois dans d'autres catégories.
Par défaut, sur une nouvelle fiche d'ouvrage, il est pratique d'avoir la derniere référence saisie incrémenté de 1.
Voici donc les deux requêtes qui permettent de réccupérer le réel dernier enregistrement :
SELECT COUNT(*) FROM `ma_table` WHERE 1;
SELECT mon_dernier_enregistrement FROM `ma_table` LIMIT le_resultat_precedant, 1;
Voila, ca peut toujours servir !
Comment optimiser une requête utilisant le limit
L'utilisation d'un limit sur une ou des tables ayant beaucoup d'enregistrements peut énormement plomber le serveur. Surtout si vous retourner des gros contenu avec beaucoup sur des petites intervale de page. Par exemple un forum qui retourne 30 enregistrements et le pire c'est l'ajout de l'ORDER BY qui ici achève le CPU mais qui est quasi obligatoire.
Pour optimiser les performances il faut deux requêtes.
La première requête utilise le LIMIT mais ne retourne que les index.
Code:
SELECT idtopic FROM forum ORDER BY date LIMIT 100,130;
De là, nous avons une suite d'index dans l'ordre.
Dans la second requête vous utilisez la fonction IN(...). IN permet d'insérer un suite de valeur que vous souhaiter retourner.
Code:
SELECT * FROM forum WHERE idtopic IN(100,101,102,103,...);
Sur des gros enregistrements vous sentirez la différence. J'en suis arrivé en faisant des test de volume. Arrivé à 100 000 enregistrements ça rame énormement avec le LIMIT intervale 30 + ORDER BY + champs TEXT et autres. Le temps d'affichage n'est pas acceptable pour le web. Venice 3200+ 1Go Mysql5 XP.
Avec cette méthode c'est totalement liquide.